Sample operator HMI (CIENG_* displays, layouts, user CIENG, live-data feed) and tested findings ISS-068..075 #24

Merged
cliu merged 7 commits from feature/cieng-hmi into main 2026-10-06 11:32:18 +11:00
16 changed files with 1604 additions and 168 deletions
Showing only changes of commit c9d2ead5d9 - Show all commits

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8" ?>
<visualization protocolVersion="1.3.0.0">
<globalSection/>
<coreObjectDefinition type="displayDefinition">
<version type="version" value="1.3.0.0"/>
<title>Process control</title>
<html>true</html>
<width>1880</width>
<height>760</height>
<referenceCheck>72</referenceCheck>
<backgroundColor type="colorSet" r="13" g="17" b="23"/>
<backgroundColorOn>true</backgroundColorOn>
<defaultBgColor type="colorSet" r="13" g="17" b="23"/>
<defaultFgColor type="colorSet" r="230" g="237" b="243"/>
<defaultFont type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/>
<defaultStroke type="stroke" width="1.0"/>
<grid type="grid" gridVisible="true" snappingActive="true" verticalSnapInterval="4" horizontalSnapInterval="4" onTop="false"><color type="colorSet" r="51" g="59" b="71"/></grid>
<revisionHistory type="revisionHistory"><revision type="revision" who="ADMIN" when="2026.10.02 12:00:00.000 AEST" what="Generated by displays/generator/build.py" where="localhost"/></revisionHistory>
<blinkDelay>500</blinkDelay>
<blinkEnabled>true</blinkEnabled>
<mousePassThrough>false</mousePassThrough>
<visibilityGroup type="componentData"><htmlId>2</htmlId><name>Overview</name><description>Always shown</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>10.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>3</htmlId><name>Rough</name><description>Shown when viewing viewing a large area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>25.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>4</htmlId><name>Standard</name><description>Shown when using the default view setting</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>100.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>5</htmlId><name>Detail</name><description>Shown only when viewing a small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>400.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>6</htmlId><name>Intricacies</name><description>Shown only when viewing a very small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>1000.0</minimumZoomFactor></visibilityGroup>
<visualizationLayer type="componentData"><htmlId>1</htmlId><name>Layer1</name></visualizationLayer>
<componentCountHint>66</componentCountHint>
<rectangle type="componentData"><htmlId>7</htmlId><x>940.0</x><y>380.0</y><top>380.0</top><bottom>380.0</bottom><left>940.0</left><right>940.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="13" g="17" b="23"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>8</htmlId><roundingX>0.0216</roundingX><roundingY>0.0551</roundingY><x>472.5</x><y>192.8</y><top>181.6</top><bottom>181.6</bottom><left>462.5</left><right>462.5</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>9</htmlId><value>SETPOINT -&gt; PLC1 (MODBUS LOOPBACK)</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>134.8</x><y>36.9</y><top>11.0</top><bottom>11.0</bottom><left>104.8</left><right>104.8</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>10</htmlId><value>Slider, spinner and input field write PLC1.SETPOINT; READBACK returns through Modbus</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>218.2</x><y>59.2</y><top>9.0</top><bottom>9.0</bottom><left>188.2</left><right>188.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<slider type="componentData" x="340.0" y="114.0" top="32.0" bottom="32.0" left="300.0" right="300.0" rotation="0.0" shear="0.0"><htmlId>11</htmlId><maximum>100.0</maximum><minimum>0.0</minimum><value>0.0</value><majorTickSpacing>10.0</majorTickSpacing><minorTickSpacing>5.0</minorTickSpacing><paintLabels>true</paintLabels><paintTicks>true</paintTicks><trackDrag>false</trackDrag><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><opaque>false</opaque><foregroundColor type="colorSet" r="139" g="152" b="168"/><data type="data"><action type="actionConnectTo"><property type="property" name="slider.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><itemName>CI-Eng-Sample.PLC1.SETPOINT</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></slider>
<text type="componentData"><htmlId>12</htmlId><value>SPINNER</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>61.0</x><y>176.6</y><top>8.0</top><bottom>8.0</bottom><left>21.0</left><right>21.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<spinner type="componentData" x="110.0" y="210.1" top="18.0" bottom="18.0" left="70.0" right="70.0" rotation="0.0" shear="0.0"><htmlId>13</htmlId><editable>true</editable><step>5.0</step><minimum>0.0</minimum><maximum>100.0</maximum><font type="font" name="Consolas" bold="true" size="14" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><zoomEnabled>false</zoomEnabled><data type="data"><action type="actionConnectTo"><property type="property" name="spinner.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><itemName>CI-Eng-Sample.PLC1.SETPOINT</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></spinner>
<text type="componentData"><htmlId>14</htmlId><value>INPUT FIELD</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>228.3</x><y>176.6</y><top>8.0</top><bottom>8.0</bottom><left>28.3</left><right>28.3</right><rotation>0.0</rotation><shear>0.0</shear></text>
<numberField type="componentData" x="270.0" y="210.1" top="18.0" bottom="18.0" left="70.0" right="70.0" rotation="0.0" shear="0.0"><htmlId>15</htmlId><font type="font" name="Consolas" bold="true" size="16" underline="false" strikethrough="false"/><format>999</format><editable>true</editable><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><justification type="jTextJustification" value="TextJustificationRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="numberField.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><itemName>CI-Eng-Sample.PLC1.SETPOINT</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></numberField>
<text type="componentData"><htmlId>16</htmlId><value>SETPOINT</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>383.4</x><y>176.6</y><top>8.0</top><bottom>8.0</bottom><left>23.4</left><right>23.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>17</htmlId><value>0.0</value><format>999</format><font type="font" name="Consolas" bold="true" size="28" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="59" g="130" b="246"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>381.9</x><y>210.1</y><top>20.0</top><bottom>20.0</bottom><left>21.9</left><right>21.9</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.SETPOINT</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>18</htmlId><value>READBACK (data bar + scale)</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>105.8</x><y>261.5</y><top>8.0</top><bottom>8.0</bottom><left>65.8</left><right>65.8</right><rotation>0.0</rotation><shear>0.0</shear></text>
<dataBar type="componentData" x="340.0" y="287.2" top="9.0" bottom="9.0" left="300.0" right="300.0" rotation="0.0" shear="0.0"><htmlId>19</htmlId><fillOn>true</fillOn><background type="paint"><paint type="colorSet" r="40" g="50" b="64"/></background><foreground type="paint"><paint type="colorSet" r="59" g="130" b="246"/></foreground><borderColor type="paint"><paint type="colorSet" r="40" g="50" b="64"/></borderColor><foregroundBorderColor type="paint"><paint type="colorSet" r="59" g="130" b="246"/></foregroundBorderColor><lowLimit>0.0</lowLimit><highLimit>100.0</highLimit><growthDirection type="growthDirection" value="GrowthDirectionRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="dataBar.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.READBACK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></dataBar>
<rectangularScale type="componentData" x="340.0" y="319.6" top="18.0" bottom="18.0" left="300.0" right="300.0" rotation="0.0" shear="0.0"><htmlId>20</htmlId><maximum>100.0</maximum><minimum>0.0</minimum><majorTickSpacing>10.0</majorTickSpacing><minorTickSpacing>5.0</minorTickSpacing><format>999</format><vertical>false</vertical><color type="colorSet" r="139" g="152" b="168"/><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/></rectangularScale>
<arc type="componentData"><htmlId>21</htmlId><startAngle>45.0</startAngle><extentAngle>270.0</extentAngle><closed>false</closed><x>790.0</x><y>195.6</y><top>95.0</top><bottom>95.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></strokePaint><fillOn>false</fillOn></arc>
<arc type="componentData"><htmlId>22</htmlId><startAngle>179.8</startAngle><extentAngle>0.5</extentAngle><closed>false</closed><x>790.0</x><y>195.6</y><top>95.0</top><bottom>95.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="59" g="130" b="246"/></strokePaint><fillOn>false</fillOn><data type="data"><action type="actionConnectTo"><property type="property" name="arc.extentAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>0.5</outputValueStart><outputValueEnd>270.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.READBACK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.startAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>179.75</outputValueStart><outputValueEnd>45.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.READBACK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></arc>
<number type="componentData"><htmlId>23</htmlId><value>0.0</value><format>999</format><font type="font" name="Consolas" bold="true" size="26" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>790.0</x><y>191.1</y><top>18.0</top><bottom>18.0</bottom><left>81.0</left><right>81.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.READBACK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>24</htmlId><value></value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>790.0</x><y>223.5</y><top>9.0</top><bottom>9.0</bottom><left>40.0</left><right>40.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>25</htmlId><value>Readback</value><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>790.0</x><y>306.2</y><top>10.0</top><bottom>10.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<ellipse type="componentData"><htmlId>26</htmlId><x>706.0</x><y>40.2</y><top>6.0</top><bottom>6.0</bottom><left>6.0</left><right>6.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.COMM_OK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>27</htmlId><value>station CIENG_PLC</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>762.9</x><y>39.1</y><top>9.0</top><bottom>9.0</bottom><left>44.9</left><right>44.9</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>28</htmlId><roundingX>0.0216</roundingX><roundingY>0.0551</roundingY><x>1407.5</x><y>192.8</y><top>181.6</top><bottom>181.6</bottom><left>462.5</left><right>462.5</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>29</htmlId><value>DIGITAL COMMAND -&gt; PLC1.CMD</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1052.8</x><y>36.9</y><top>11.0</top><bottom>11.0</bottom><left>87.8</left><right>87.8</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>30</htmlId><value>Toggle and push buttons write the coil; FEEDBACK is read back from the input bit</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1139.0</x><y>59.2</y><top>9.0</top><bottom>9.0</bottom><left>174.0</left><right>174.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<toggleButton type="componentData" x="1075.0" y="116.2" top="24.0" bottom="24.0" left="100.0" right="100.0" rotation="0.0" shear="0.0"><htmlId>31</htmlId><label>CMD (toggle)</label><font type="font" name="Segoe UI" bold="true" size="14" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><data type="data"><action type="actionConnectTo"><property type="property" name="toggleButton.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><itemName>CI-Eng-Sample.PLC1.CMD</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></toggleButton>
<button type="componentData" x="1022.5" y="190.0" top="20.0" bottom="20.0" left="47.5" right="47.5" rotation="0.0" shear="0.0"><htmlId>32</htmlId><label>Set ON</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="34" g="197" b="94"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>1.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.PLC1.CMD</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<button type="componentData" x="1127.5" y="190.0" top="20.0" bottom="20.0" left="47.5" right="47.5" rotation="0.0" shear="0.0"><htmlId>33</htmlId><label>Set OFF</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.PLC1.CMD</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<ellipse type="componentData"><htmlId>34</htmlId><x>1360.0</x><y>156.5</y><top>60.0</top><bottom>60.0</bottom><left>60.0</left><right>60.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="3.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="71" g="85" b="105"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="71" g="85" b="105"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.FEEDBACK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>35</htmlId><value>FEEDBACK</value><font type="font" name="Segoe UI" bold="true" size="13" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="255" g="255" b="255"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1360.0</x><y>156.5</y><top>12.0</top><bottom>12.0</bottom><left>60.0</left><right>60.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>36</htmlId><value>LAST CHANGE OF FEEDBACK</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1525.3</x><y>109.5</y><top>8.0</top><bottom>8.0</bottom><left>65.3</left><right>65.3</right><rotation>0.0</rotation><shear>0.0</shear></text>
<dateTimeField type="componentData" x="1610.0" y="141.9" top="15.0" bottom="15.0" left="150.0" right="150.0" rotation="0.0" shear="0.0"><htmlId>37</htmlId><font type="font" name="Segoe UI" size="13" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><editable>true</editable><secondsVisible>true</secondsVisible><backgroundColor type="colorSet" r="36" g="45" b="57"/><data type="data"><action type="actionConnectTo"><property type="property" name="dateTimeField.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.FEEDBACK</itemName><itemAttribute>ItemUpdTime</itemAttribute></connection></action></data></dateTimeField>
<text type="componentData"><htmlId>38</htmlId><value>STATUS</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1478.5</x><y>187.8</y><top>8.0</top><bottom>8.0</bottom><left>18.5</left><right>18.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>39</htmlId><value>NORMAL</value><font type="font" name="Segoe UI" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1493.6</x><y>214.6</y><top>12.0</top><bottom>12.0</bottom><left>33.6</left><right>33.6</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.FEEDBACK</itemName><itemAttribute>ItemStatusMnemonic</itemAttribute></connection></action></data></text>
<rectangle type="componentData"><htmlId>40</htmlId><roundingX>0.0216</roundingX><roundingY>0.0551</roundingY><x>472.5</x><y>567.2</y><top>181.6</top><bottom>181.6</bottom><left>462.5</left><right>462.5</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>41</htmlId><value>PUMP 1</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>50.5</x><y>411.3</y><top>11.0</top><bottom>11.0</bottom><left>20.5</left><right>20.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>42</htmlId><value>Combo box, buttons and check box write PUMP1.MODE / PUMP1.RUNNING (mode changes are audited)</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>257.7</x><y>433.6</y><top>9.0</top><bottom>9.0</bottom><left>227.7</left><right>227.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>43</htmlId><value>MODE (COMBO BOX)</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>90.2</x><y>456.0</y><top>8.0</top><bottom>8.0</bottom><left>50.2</left><right>50.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<comboBox type="componentData" x="140.0" y="488.4" top="17.0" bottom="17.0" left="100.0" right="100.0" rotation="0.0" shear="0.0"><htmlId>44</htmlId><label>0;Manual;1;Auto</label><font type="font" name="Segoe UI" size="14" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><data type="data"><action type="actionConnectTo"><property type="property" name="comboBox.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><itemName>CI-Eng-Sample.PUMP1.MODE</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></comboBox>
<button type="componentData" x="315.0" y="488.4" top="17.0" bottom="17.0" left="55.0" right="55.0" rotation="0.0" shear="0.0"><htmlId>45</htmlId><label>Manual</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.PUMP1.MODE</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<button type="componentData" x="435.0" y="488.4" top="17.0" bottom="17.0" left="55.0" right="55.0" rotation="0.0" shear="0.0"><htmlId>46</htmlId><label>Auto</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="59" g="130" b="246"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>1.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.PUMP1.MODE</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<text type="componentData"><htmlId>47</htmlId><value>RUN COMMAND (CHECK BOX, MANUAL MODE)</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>152.1</x><y>543.2</y><top>8.0</top><bottom>8.0</bottom><left>112.1</left><right>112.1</right><rotation>0.0</rotation><shear>0.0</shear></text>
<checkBox type="componentData" x="160.0" y="574.5" top="16.0" bottom="16.0" left="120.0" right="120.0" rotation="0.0" shear="0.0"><htmlId>48</htmlId><label>Pump running</label><font type="font" name="Segoe UI" size="14" underline="false" strikethrough="false"/><opaque>false</opaque><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="28" g="35" b="45"/><data type="data"><action type="actionConnectTo"><property type="property" name="checkBox.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><itemName>CI-Eng-Sample.PUMP1.RUNNING</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></checkBox>
<text type="componentData"><htmlId>49</htmlId><value>DESCRIPTION (TEXT FIELD)</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>102.4</x><y>625.9</y><top>8.0</top><bottom>8.0</bottom><left>62.4</left><right>62.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<textField type="componentData" x="265.0" y="656.1" top="15.0" bottom="15.0" left="225.0" right="225.0" rotation="0.0" shear="0.0"><htmlId>50</htmlId><font type="font" name="Segoe UI" size="13" underline="false" strikethrough="false"/><editable>false</editable><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><data type="data"><action type="actionConnectTo"><property type="property" name="textField.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.MODE</itemName><itemAttribute>ItemDesc</itemAttribute></connection></action></data></textField>
<ellipse type="componentData"><htmlId>51</htmlId><x>655.0</x><y>530.9</y><top>55.0</top><bottom>55.0</bottom><left>55.0</left><right>55.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="3.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="71" g="85" b="105"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="71" g="85" b="105"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>52</htmlId><value>P1</value><font type="font" name="Segoe UI" bold="true" size="18" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="255" g="255" b="255"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>655.0</x><y>529.8</y><top>12.0</top><bottom>12.0</bottom><left>55.0</left><right>55.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>53</htmlId><value>RUN TIME (INTEGRATOR)</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>670.0</x><y>621.4</y><top>8.0</top><bottom>8.0</bottom><left>110.0</left><right>110.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>54</htmlId><value>0.0</value><format>9999999</format><font type="font" name="Consolas" bold="true" size="24" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>705.6</x><y>651.6</y><top>17.0</top><bottom>17.0</bottom><left>44.4</left><right>44.4</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>55</htmlId><value>s</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>756.4</x><y>653.8</y><top>9.0</top><bottom>9.0</bottom><left>2.4</left><right>2.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>56</htmlId><roundingX>0.0216</roundingX><roundingY>0.0551</roundingY><x>1407.5</x><y>567.2</y><top>181.6</top><bottom>181.6</bottom><left>462.5</left><right>462.5</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>57</htmlId><value>TANK 1 - ALARM TEST</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1021.5</x><y>411.3</y><top>11.0</top><bottom>11.0</bottom><left>56.5</left><right>56.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>58</htmlId><value>Stop live data first, then drive TANK1.LEVEL across its limits (H 80 / HH 90 / L 20 / LL 10)</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1150.2</x><y>433.6</y><top>9.0</top><bottom>9.0</bottom><left>185.2</left><right>185.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<slider type="componentData" x="1255.0" y="494.0" top="32.0" bottom="32.0" left="280.0" right="280.0" rotation="0.0" shear="0.0"><htmlId>59</htmlId><maximum>100.0</maximum><minimum>0.0</minimum><value>0.0</value><majorTickSpacing>10.0</majorTickSpacing><minorTickSpacing>5.0</minorTickSpacing><paintLabels>true</paintLabels><paintTicks>true</paintTicks><trackDrag>false</trackDrag><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><opaque>false</opaque><foregroundColor type="colorSet" r="139" g="152" b="168"/><data type="data"><action type="actionConnectTo"><property type="property" name="slider.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></slider>
<button type="componentData" x="1028.0" y="580.1" top="19.0" bottom="19.0" left="53.0" right="53.0" rotation="0.0" shear="0.0"><htmlId>60</htmlId><label>Low-Low 5</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="239" g="68" b="68"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>5.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<button type="componentData" x="1142.0" y="580.1" top="19.0" bottom="19.0" left="53.0" right="53.0" rotation="0.0" shear="0.0"><htmlId>61</htmlId><label>Low 15</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="245" g="158" b="11"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>15.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<button type="componentData" x="1256.0" y="580.1" top="19.0" bottom="19.0" left="53.0" right="53.0" rotation="0.0" shear="0.0"><htmlId>62</htmlId><label>Normal 50</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="20" g="184" b="166"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>50.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<button type="componentData" x="1370.0" y="580.1" top="19.0" bottom="19.0" left="53.0" right="53.0" rotation="0.0" shear="0.0"><htmlId>63</htmlId><label>High 85</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="245" g="158" b="11"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>85.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<button type="componentData" x="1484.0" y="580.1" top="19.0" bottom="19.0" left="53.0" right="53.0" rotation="0.0" shear="0.0"><htmlId>64</htmlId><label>High-High 95</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="239" g="68" b="68"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>95.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<text type="componentData"><htmlId>65</htmlId><value>LEVEL</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>988.2</x><y>641.5</y><top>8.0</top><bottom>8.0</bottom><left>13.2</left><right>13.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>66</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="38" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1026.2</x><y>680.6</y><top>25.0</top><bottom>25.0</bottom><left>51.2</left><right>51.2</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="number.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>67</htmlId><value>ITEM STATUS</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1211.7</x><y>641.5</y><top>8.0</top><bottom>8.0</bottom><left>31.7</left><right>31.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>68</htmlId><value>NORMAL</value><font type="font" name="Segoe UI" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1226.3</x><y>678.4</y><top>17.0</top><bottom>17.0</bottom><left>46.3</left><right>46.3</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemStatusMnemonic</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="text.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></text>
<arc type="componentData"><htmlId>69</htmlId><startAngle>45.0</startAngle><extentAngle>270.0</extentAngle><closed>false</closed><x>1720.0</x><y>581.2</y><top>90.0</top><bottom>90.0</bottom><left>90.0</left><right>90.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="14.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></strokePaint><fillOn>false</fillOn></arc>
<arc type="componentData"><htmlId>70</htmlId><startAngle>179.8</startAngle><extentAngle>0.5</extentAngle><closed>false</closed><x>1720.0</x><y>581.2</y><top>90.0</top><bottom>90.0</bottom><left>90.0</left><right>90.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="14.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></strokePaint><fillOn>false</fillOn><data type="data"><action type="actionConnectTo"><property type="property" name="arc.extentAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>0.5</outputValueStart><outputValueEnd>270.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.startAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>179.75</outputValueStart><outputValueEnd>45.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.strokePaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></arc>
<circularScale type="componentData" x="1720.0" y="581.2" top="120.0" bottom="120.0" left="120.0" right="120.0" rotation="0.0" shear="0.0"><htmlId>71</htmlId><maximum>100.0</maximum><minimum>0.0</minimum><majorTickSpacing>20.0</majorTickSpacing><minorTickSpacing>5.0</minorTickSpacing><format>999</format><startAngle>225.0</startAngle><extentAngle>-270.0</extentAngle><color type="colorSet" r="139" g="152" b="168"/><font type="font" name="Segoe UI" size="9" underline="false" strikethrough="false"/></circularScale>
<number type="componentData"><htmlId>72</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="26" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1720.0</x><y>581.2</y><top>20.0</top><bottom>20.0</bottom><left>60.0</left><right>60.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
</coreObjectDefinition>
</visualization>

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8" ?>
<visualization protocolVersion="1.3.0.0">
<globalSection/>
<coreObjectDefinition type="displayDefinition">
<version type="version" value="1.3.0.0"/>
<title>Header</title>
<html>true</html>
<width>1920</width>
<height>96</height>
<referenceCheck>43</referenceCheck>
<backgroundColor type="colorSet" r="22" g="27" b="34"/>
<backgroundColorOn>true</backgroundColorOn>
<defaultBgColor type="colorSet" r="22" g="27" b="34"/>
<defaultFgColor type="colorSet" r="230" g="237" b="243"/>
<defaultFont type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/>
<defaultStroke type="stroke" width="1.0"/>
<grid type="grid" gridVisible="true" snappingActive="true" verticalSnapInterval="4" horizontalSnapInterval="4" onTop="false"><color type="colorSet" r="51" g="59" b="71"/></grid>
<revisionHistory type="revisionHistory"><revision type="revision" who="ADMIN" when="2026.10.02 12:00:00.000 AEST" what="Generated by displays/generator/build.py" where="localhost"/></revisionHistory>
<blinkDelay>500</blinkDelay>
<blinkEnabled>true</blinkEnabled>
<mousePassThrough>false</mousePassThrough>
<visibilityGroup type="componentData"><htmlId>2</htmlId><name>Overview</name><description>Always shown</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>10.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>3</htmlId><name>Rough</name><description>Shown when viewing viewing a large area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>25.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>4</htmlId><name>Standard</name><description>Shown when using the default view setting</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>100.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>5</htmlId><name>Detail</name><description>Shown only when viewing a small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>400.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>6</htmlId><name>Intricacies</name><description>Shown only when viewing a very small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>1000.0</minimumZoomFactor></visibilityGroup>
<visualizationLayer type="componentData"><htmlId>1</htmlId><name>Layer1</name></visualizationLayer>
<componentCountHint>37</componentCountHint>
<rectangle type="componentData"><htmlId>7</htmlId><x>960.0</x><y>48.0</y><top>48.0</top><bottom>48.0</bottom><left>960.0</left><right>960.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>8</htmlId><x>960.0</x><y>95.0</y><top>0.5</top><bottom>0.5</bottom><left>960.0</left><right>960.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>9</htmlId><roundingX>0.4667</roundingX><roundingY>0.4667</roundingY><x>50.0</x><y>48.0</y><top>30.0</top><bottom>30.0</bottom><left>30.0</left><right>30.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="59" g="130" b="246"/></fillPaint></rectangle>
<text type="componentData"><htmlId>10</htmlId><value>CI</value><font type="font" name="Segoe UI" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="255" g="255" b="255"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>50.0</x><y>48.0</y><top>14.0</top><bottom>14.0</bottom><left>30.0</left><right>30.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>11</htmlId><value>CI-Eng-Sample</value><font type="font" name="Segoe UI" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>171.1</x><y>33.0</y><top>15.0</top><bottom>15.0</bottom><left>75.1</left><right>75.1</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>12</htmlId><value>Operations dashboard | Tank farm demo</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>201.8</x><y>62.0</y><top>10.0</top><bottom>10.0</bottom><left>105.8</left><right>105.8</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>13</htmlId><roundingX>0.0952</roundingX><roundingY>0.2353</roundingY><x>604.0</x><y>48.0</y><top>34.0</top><bottom>34.0</bottom><left>84.0</left><right>84.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>14</htmlId><value>TANK LEVEL</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>561.8</x><y>30.0</y><top>8.0</top><bottom>8.0</bottom><left>27.8</left><right>27.8</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>15</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>563.2</x><y>56.0</y><top>16.0</top><bottom>16.0</bottom><left>29.2</left><right>29.2</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="number.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>16</htmlId><value>%</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>642.4</x><y>59.0</y><top>9.0</top><bottom>9.0</bottom><left>4.4</left><right>4.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>17</htmlId><roundingX>0.0952</roundingX><roundingY>0.2353</roundingY><x>784.0</x><y>48.0</y><top>34.0</top><bottom>34.0</bottom><left>84.0</left><right>84.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>18</htmlId><value>INFLOW</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>733.0</x><y>30.0</y><top>8.0</top><bottom>8.0</bottom><left>19.0</left><right>19.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>19</htmlId><value>0.0</value><format>9999.9</format><font type="font" name="Consolas" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>749.1</x><y>56.0</y><top>16.0</top><bottom>16.0</bottom><left>35.1</left><right>35.1</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>20</htmlId><value>m3/h</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>830.2</x><y>59.0</y><top>9.0</top><bottom>9.0</bottom><left>12.2</left><right>12.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>21</htmlId><roundingX>0.0952</roundingX><roundingY>0.2353</roundingY><x>964.0</x><y>48.0</y><top>34.0</top><bottom>34.0</bottom><left>84.0</left><right>84.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>22</htmlId><value>VOLUME</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>914.5</x><y>30.0</y><top>8.0</top><bottom>8.0</bottom><left>20.5</left><right>20.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>23</htmlId><value>0.0</value><format>9999.9</format><font type="font" name="Consolas" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>929.1</x><y>56.0</y><top>16.0</top><bottom>16.0</bottom><left>35.1</left><right>35.1</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.CALC.VOLUME</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>24</htmlId><value>m3</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1005.3</x><y>59.0</y><top>9.0</top><bottom>9.0</bottom><left>7.3</left><right>7.3</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>25</htmlId><roundingX>0.0952</roundingX><roundingY>0.2353</roundingY><x>1144.0</x><y>48.0</y><top>34.0</top><bottom>34.0</bottom><left>84.0</left><right>84.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>26</htmlId><value>PUMP 1</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1092.5</x><y>30.0</y><top>8.0</top><bottom>8.0</bottom><left>18.5</left><right>18.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<ellipse type="componentData"><htmlId>27</htmlId><x>1083.0</x><y>57.0</y><top>9.0</top><bottom>9.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="71" g="85" b="105"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="71" g="85" b="105"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>28</htmlId><value>RUNNING</value><font type="font" name="Segoe UI" bold="true" size="14" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="34" g="197" b="94"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1132.2</x><y>56.0</y><top>12.0</top><bottom>12.0</bottom><left>32.2</left><right>32.2</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.visible"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>java.lang.Boolean</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut>false</thresholdOut><thresholdIn>true</thresholdIn><thresholdOut>true</thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></text>
<text type="componentData"><htmlId>29</htmlId><value>STOPPED</value><font type="font" name="Segoe UI" bold="true" size="14" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1130.2</x><y>56.0</y><top>12.0</top><bottom>12.0</bottom><left>30.2</left><right>30.2</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.visible"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>java.lang.Boolean</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut>true</thresholdOut><thresholdIn>true</thresholdIn><thresholdOut>false</thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></text>
<rectangle type="componentData"><htmlId>30</htmlId><roundingX>0.0952</roundingX><roundingY>0.2353</roundingY><x>1324.0</x><y>48.0</y><top>34.0</top><bottom>34.0</bottom><left>84.0</left><right>84.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>31</htmlId><value>COMMUNICATION</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1297.9</x><y>30.0</y><top>8.0</top><bottom>8.0</bottom><left>43.9</left><right>43.9</right><rotation>0.0</rotation><shear>0.0</shear></text>
<ellipse type="componentData"><htmlId>32</htmlId><x>1261.0</x><y>57.0</y><top>7.0</top><bottom>7.0</bottom><left>7.0</left><right>7.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.COMM_OK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>33</htmlId><value>PLC1</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1286.7</x><y>56.0</y><top>10.0</top><bottom>10.0</bottom><left>12.7</left><right>12.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<ellipse type="componentData"><htmlId>34</htmlId><x>1337.0</x><y>57.0</y><top>7.0</top><bottom>7.0</bottom><left>7.0</left><right>7.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.UA.COMM_OK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>35</htmlId><value>OPC UA</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1370.5</x><y>56.0</y><top>10.0</top><bottom>10.0</bottom><left>20.5</left><right>20.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>36</htmlId><roundingX>0.0640</roundingX><roundingY>0.2353</roundingY><x>1549.0</x><y>48.0</y><top>34.0</top><bottom>34.0</bottom><left>125.0</left><right>125.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>37</htmlId><value>LIVE DATA</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1462.4</x><y>30.0</y><top>8.0</top><bottom>8.0</bottom><left>24.4</left><right>24.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<ellipse type="componentData"><htmlId>38</htmlId><x>1542.0</x><y>29.0</y><top>6.0</top><bottom>6.0</bottom><left>6.0</left><right>6.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="71" g="85" b="105"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="71" g="85" b="105"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.DEMO.FEED_ON</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<button type="componentData" x="1490.0" y="59.0" top="15.0" bottom="15.0" left="52.0" right="52.0" rotation="0.0" shear="0.0"><htmlId>39</htmlId><toolTipText>Start the live-data feed (cieng_feed.ps1) on the server</toolTipText><label>Start</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="34" g="197" b="94"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>1.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.DEMO.FEED_ON</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionExecuteCommand"><event type="event" event="On action"/><command>cmd /c "C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd"</command><onServer>true</onServer></action></data></button>
<button type="componentData" x="1606.0" y="59.0" top="15.0" bottom="15.0" left="52.0" right="52.0" rotation="0.0" shear="0.0"><htmlId>40</htmlId><toolTipText>Stop the feed (ends within 5 s)</toolTipText><label>Stop</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><data type="data"><action type="actionSetItemAttribute"><event type="event" event="On action"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>2</direction><location type="nodeName" node="$default$"/><itemName>CI-Eng-Sample.DEMO.FEED_ON</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></button>
<button type="componentData" x="1734.0" y="48.0" top="34.0" bottom="34.0" left="46.0" right="46.0" rotation="0.0" shear="0.0"><htmlId>41</htmlId><toolTipText>Open the Tank 1 faceplate popup</toolTipText><label>Tank 1</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="59" g="130" b="246"/><data type="data"><action type="actionActivateDisplay"><event type="event" event="On action"/><type type="displayActivationType" value="ActivateSpecific"/><display>CIENG_TankFaceplate</display><layout>CIENG_Popup</layout><layoutFrame>default</layoutFrame></action></data></button>
<text type="componentData"><htmlId>42</htmlId><value>LAST UPDATE</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1823.7</x><y>30.0</y><top>8.0</top><bottom>8.0</bottom><left>31.7</left><right>31.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<numberField type="componentData" x="1853.0" y="58.0" top="14.0" bottom="14.0" left="61.0" right="61.0" rotation="0.0" shear="0.0"><htmlId>43</htmlId><font type="font" name="Consolas" bold="true" size="9" underline="false" strikethrough="false"/><format></format><editable>false</editable><asDateTime>true</asDateTime><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><justification type="jTextJustification" value="TextJustificationRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="numberField.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.DEMO.COUNTER</itemName><itemAttribute>ItemUpdTime</itemAttribute></connection></action></data></numberField>
</coreObjectDefinition>
</visualization>

View file

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8" ?>
<visualization protocolVersion="1.3.0.0">
<globalSection/>
<coreObjectDefinition type="displayDefinition">
<version type="version" value="1.3.0.0"/>
<title>Overview</title>
<html>true</html>
<width>1880</width>
<height>760</height>
<referenceCheck>76</referenceCheck>
<backgroundColor type="colorSet" r="13" g="17" b="23"/>
<backgroundColorOn>true</backgroundColorOn>
<defaultBgColor type="colorSet" r="13" g="17" b="23"/>
<defaultFgColor type="colorSet" r="230" g="237" b="243"/>
<defaultFont type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/>
<defaultStroke type="stroke" width="1.0"/>
<grid type="grid" gridVisible="true" snappingActive="true" verticalSnapInterval="4" horizontalSnapInterval="4" onTop="false"><color type="colorSet" r="51" g="59" b="71"/></grid>
<revisionHistory type="revisionHistory"><revision type="revision" who="ADMIN" when="2026.10.02 12:00:00.000 AEST" what="Generated by displays/generator/build.py" where="localhost"/></revisionHistory>
<blinkDelay>500</blinkDelay>
<blinkEnabled>true</blinkEnabled>
<mousePassThrough>false</mousePassThrough>
<visibilityGroup type="componentData"><htmlId>2</htmlId><name>Overview</name><description>Always shown</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>10.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>3</htmlId><name>Rough</name><description>Shown when viewing viewing a large area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>25.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>4</htmlId><name>Standard</name><description>Shown when using the default view setting</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>100.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>5</htmlId><name>Detail</name><description>Shown only when viewing a small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>400.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>6</htmlId><name>Intricacies</name><description>Shown only when viewing a very small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>1000.0</minimumZoomFactor></visibilityGroup>
<visualizationLayer type="componentData"><htmlId>1</htmlId><name>Layer1</name></visualizationLayer>
<componentCountHint>70</componentCountHint>
<rectangle type="componentData"><htmlId>7</htmlId><x>940.0</x><y>380.0</y><top>380.0</top><bottom>380.0</bottom><left>940.0</left><right>940.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="13" g="17" b="23"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>8</htmlId><roundingX>0.0180</roundingX><roundingY>0.0271</roundingY><x>565.0</x><y>380.0</y><top>368.8</top><bottom>368.8</bottom><left>555.0</left><right>555.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>9</htmlId><value>PROCESS - TANK 1</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>76.8</x><y>36.9</y><top>11.0</top><bottom>11.0</bottom><left>46.8</left><right>46.8</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>10</htmlId><value>Click the tank for its faceplate</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>92.4</x><y>59.2</y><top>9.0</top><bottom>9.0</bottom><left>62.4</left><right>62.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>11</htmlId><x>250.0</x><y>377.8</y><top>8.0</top><bottom>8.0</bottom><left>190.0</left><right>190.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>12</htmlId><x>250.0</x><y>377.8</y><top>5.0</top><bottom>5.0</bottom><left>190.0</left><right>190.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="rectangle.visible"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>java.lang.Boolean</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut>false</thresholdOut><thresholdIn>5.0</thresholdIn><thresholdOut>true</thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></rectangle>
<text type="componentData"><htmlId>13</htmlId><value>INFLOW</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>79.0</x><y>288.4</y><top>8.0</top><bottom>8.0</bottom><left>19.0</left><right>19.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>14</htmlId><value>0.0</value><format>9999.9</format><font type="font" name="Consolas" bold="true" size="30" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>109.7</x><y>321.9</y><top>20.0</top><bottom>20.0</bottom><left>49.7</left><right>49.7</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>15</htmlId><value>m3/h</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>227.7</x><y>326.4</y><top>10.0</top><bottom>10.0</bottom><left>13.7</left><right>13.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>16</htmlId><toolTipText>Tank 1 - click for the faceplate</toolTipText><roundingX>0.1500</roundingX><roundingY>0.0671</roundingY><x>560.0</x><y>380.0</y><top>268.2</top><bottom>268.2</bottom><left>120.0</left><right>120.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="2.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint><data type="data"><action type="actionActivateDisplay"><event type="event" event="Clicked b1"/><type type="displayActivationType" value="ActivateSpecific"/><display>CIENG_TankFaceplate</display><layout>CIENG_Popup</layout><layoutFrame>default</layoutFrame></action></data></rectangle>
<rectangle type="componentData"><htmlId>17</htmlId><roundingX>0.1091</roundingX><roundingY>0.0467</roundingY><x>560.0</x><y>380.0</y><top>257.1</top><bottom>257.1</bottom><left>110.0</left><right>110.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="59" g="130" b="246"/></fillPaint><fillAmount>0.5</fillAmount><fillDirection type="fillDirection" value="FillDirectionUp"/><data type="data"><action type="actionConnectTo"><property type="property" name="rectangle.fillAmount"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>0.0</outputValueStart><outputValueEnd>1.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="rectangle.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="185" g="28" b="28"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="180" g="83" b="9"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="37" g="99" b="235"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="180" g="83" b="9"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="185" g="28" b="28"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionActivateDisplay"><event type="event" event="Clicked b1"/><type type="displayActivationType" value="ActivateSpecific"/><display>CIENG_TankFaceplate</display><layout>CIENG_Popup</layout><layoutFrame>default</layoutFrame></action></data></rectangle>
<text type="componentData"><htmlId>18</htmlId><value>TANK 1</value><font type="font" name="Segoe UI" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>560.0</x><y>82.7</y><top>14.0</top><bottom>14.0</bottom><left>110.0</left><right>110.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>19</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="40" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="255" g="255" b="255"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>560.0</x><y>363.2</y><top>25.0</top><bottom>25.0</bottom><left>100.0</left><right>100.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>20</htmlId><value>% level</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>560.0</x><y>404.6</y><top>10.0</top><bottom>10.0</bottom><left>100.0</left><right>100.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>21</htmlId><x>691.0</x><y>174.4</y><top>1.0</top><bottom>1.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint></rectangle>
<text type="componentData"><htmlId>22</htmlId><value>HH 90</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>721.1</x><y>174.4</y><top>9.0</top><bottom>9.0</bottom><left>15.1</left><right>15.1</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>23</htmlId><x>691.0</x><y>225.8</y><top>1.0</top><bottom>1.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint></rectangle>
<text type="componentData"><htmlId>24</htmlId><value>H 80</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>717.2</x><y>225.8</y><top>9.0</top><bottom>9.0</bottom><left>11.2</left><right>11.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>25</htmlId><x>691.0</x><y>534.2</y><top>1.0</top><bottom>1.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint></rectangle>
<text type="componentData"><htmlId>26</htmlId><value>L 20</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>715.8</x><y>534.2</y><top>9.0</top><bottom>9.0</bottom><left>9.8</left><right>9.8</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>27</htmlId><x>691.0</x><y>585.6</y><top>1.0</top><bottom>1.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint></rectangle>
<text type="componentData"><htmlId>28</htmlId><value>LL 10</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>718.2</x><y>585.6</y><top>9.0</top><bottom>9.0</bottom><left>12.2</left><right>12.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<button type="componentData" x="560.0" y="681.8" top="16.0" bottom="16.0" left="90.0" right="90.0" rotation="0.0" shear="0.0"><htmlId>29</htmlId><label>Open faceplate</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="59" g="130" b="246"/><data type="data"><action type="actionActivateDisplay"><event type="event" event="On action"/><type type="displayActivationType" value="ActivateSpecific"/><display>CIENG_TankFaceplate</display><layout>CIENG_Popup</layout><layoutFrame>default</layoutFrame></action></data></button>
<rectangle type="componentData"><htmlId>30</htmlId><x>755.0</x><y>603.5</y><top>8.0</top><bottom>8.0</bottom><left>75.0</left><right>75.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>31</htmlId><x>755.0</x><y>603.5</y><top>5.0</top><bottom>5.0</bottom><left>75.0</left><right>75.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="rectangle.visible"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></rectangle>
<ellipse type="componentData"><htmlId>32</htmlId><x>875.0</x><y>603.5</y><top>45.0</top><bottom>45.0</bottom><left>45.0</left><right>45.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="2.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="71" g="85" b="105"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="71" g="85" b="105"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>33</htmlId><value>P1</value><font type="font" name="Segoe UI" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="255" g="255" b="255"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>875.0</x><y>603.5</y><top>12.0</top><bottom>12.0</bottom><left>45.0</left><right>45.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>34</htmlId><x>1005.0</x><y>603.5</y><top>8.0</top><bottom>8.0</bottom><left>85.0</left><right>85.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>35</htmlId><x>1005.0</x><y>603.5</y><top>5.0</top><bottom>5.0</bottom><left>85.0</left><right>85.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="rectangle.visible"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></rectangle>
<text type="componentData"><htmlId>36</htmlId><value>PUMP 1</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>875.0</x><y>680.6</y><top>9.0</top><bottom>9.0</bottom><left>75.0</left><right>75.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>37</htmlId><value>AUTO</value><font type="font" name="Segoe UI" bold="true" size="13" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>875.0</x><y>704.1</y><top>10.0</top><bottom>10.0</bottom><left>75.0</left><right>75.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.visible"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>java.lang.Boolean</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut>false</thresholdOut><thresholdIn>1.0</thresholdIn><thresholdOut>true</thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.MODE</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></text>
<text type="componentData"><htmlId>38</htmlId><value>MANUAL</value><font type="font" name="Segoe UI" bold="true" size="13" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>875.0</x><y>704.1</y><top>10.0</top><bottom>10.0</bottom><left>75.0</left><right>75.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.visible"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>java.lang.Boolean</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut>true</thresholdOut><thresholdIn>1.0</thresholdIn><thresholdOut>false</thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.MODE</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></text>
<rectangle type="componentData"><htmlId>39</htmlId><roundingX>0.0696</roundingX><roundingY>0.0434</roundingY><x>975.0</x><y>285.0</y><top>184.4</top><bottom>184.4</bottom><left>115.0</left><right>115.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<text type="componentData"><htmlId>40</htmlId><value>VOLUME (TANK1.CALC)</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>926.2</x><y>125.2</y><top>8.0</top><bottom>8.0</bottom><left>50.2</left><right>50.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>41</htmlId><value>0.0</value><format>9999.9</format><font type="font" name="Consolas" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>911.1</x><y>153.1</y><top>15.0</top><bottom>15.0</bottom><left>35.1</left><right>35.1</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.CALC.VOLUME</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>42</htmlId><value>m3</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1035.3</x><y>155.4</y><top>9.0</top><bottom>9.0</bottom><left>7.3</left><right>7.3</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>43</htmlId><value>FLOW PER SECOND (JFLOW)</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>938.4</x><y>196.7</y><top>8.0</top><bottom>8.0</bottom><left>62.4</left><right>62.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>44</htmlId><value>0.0</value><format>999.99</format><font type="font" name="Consolas" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>911.1</x><y>224.6</y><top>15.0</top><bottom>15.0</bottom><left>35.1</left><right>35.1</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.JFLOW.sPerMin</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>45</htmlId><value>m3/s</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1039.7</x><y>226.9</y><top>9.0</top><bottom>9.0</bottom><left>11.7</left><right>11.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>46</htmlId><value>LEVEL MAXIMUM</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>914.0</x><y>268.2</y><top>8.0</top><bottom>8.0</bottom><left>38.0</left><right>38.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>47</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>905.2</x><y>296.2</y><top>15.0</top><bottom>15.0</bottom><left>29.2</left><right>29.2</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL.MAX</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>48</htmlId><value>%</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1032.4</x><y>298.4</y><top>9.0</top><bottom>9.0</bottom><left>4.4</left><right>4.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>49</htmlId><value>COUNTER (DEMO.INCR1)</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>930.1</x><y>339.8</y><top>8.0</top><bottom>8.0</bottom><left>54.1</left><right>54.1</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>50</htmlId><value>0.0</value><format>999</format><font type="font" name="Consolas" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>893.5</x><y>367.7</y><top>15.0</top><bottom>15.0</bottom><left>17.6</left><right>17.6</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.DEMO.COUNTER</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>51</htmlId><value></value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1030.0</x><y>369.9</y><top>9.0</top><bottom>9.0</bottom><left>2.0</left><right>2.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<dataBar type="componentData" x="975.0" y="399.0" top="5.0" bottom="5.0" left="99.0" right="99.0" rotation="0.0" shear="0.0"><htmlId>52</htmlId><fillOn>true</fillOn><background type="paint"><paint type="colorSet" r="40" g="50" b="64"/></background><foreground type="paint"><paint type="colorSet" r="139" g="92" b="246"/></foreground><borderColor type="paint"><paint type="colorSet" r="40" g="50" b="64"/></borderColor><foregroundBorderColor type="paint"><paint type="colorSet" r="139" g="92" b="246"/></foregroundBorderColor><lowLimit>0.0</lowLimit><highLimit>100.0</highLimit><growthDirection type="growthDirection" value="GrowthDirectionRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="dataBar.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.DEMO.COUNTER</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></dataBar>
<text type="componentData"><htmlId>53</htmlId><value>PUMP RUN TIME</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>913.0</x><y>429.2</y><top>8.0</top><bottom>8.0</bottom><left>37.0</left><right>37.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>54</htmlId><value>0.0</value><format>9999999</format><font type="font" name="Consolas" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>906.7</x><y>451.5</y><top>12.0</top><bottom>12.0</bottom><left>30.7</left><right>30.7</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>55</htmlId><value>s</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1032.4</x><y>452.6</y><top>9.0</top><bottom>9.0</bottom><left>2.4</left><right>2.4</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>56</htmlId><roundingX>0.0270</roundingX><roundingY>0.0542</roundingY><x>1500.0</x><y>195.6</y><top>184.4</top><bottom>184.4</bottom><left>370.0</left><right>370.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>57</htmlId><value>KEY FIGURES</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1182.7</x><y>36.9</y><top>11.0</top><bottom>11.0</bottom><left>32.7</left><right>32.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<arc type="componentData"><htmlId>58</htmlId><startAngle>45.0</startAngle><extentAngle>270.0</extentAngle><closed>false</closed><x>1255.0</x><y>195.6</y><top>95.0</top><bottom>95.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></strokePaint><fillOn>false</fillOn></arc>
<arc type="componentData"><htmlId>59</htmlId><startAngle>179.8</startAngle><extentAngle>0.5</extentAngle><closed>false</closed><x>1255.0</x><y>195.6</y><top>95.0</top><bottom>95.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></strokePaint><fillOn>false</fillOn><data type="data"><action type="actionConnectTo"><property type="property" name="arc.extentAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>0.5</outputValueStart><outputValueEnd>270.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.startAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>179.75</outputValueStart><outputValueEnd>45.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.strokePaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></arc>
<number type="componentData"><htmlId>60</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="26" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1255.0</x><y>191.1</y><top>18.0</top><bottom>18.0</bottom><left>81.0</left><right>81.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="number.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>61</htmlId><value>%</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1255.0</x><y>223.5</y><top>9.0</top><bottom>9.0</bottom><left>40.0</left><right>40.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>62</htmlId><value>Level</value><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1255.0</x><y>306.2</y><top>10.0</top><bottom>10.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<arc type="componentData"><htmlId>63</htmlId><startAngle>45.0</startAngle><extentAngle>270.0</extentAngle><closed>false</closed><x>1500.0</x><y>195.6</y><top>95.0</top><bottom>95.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></strokePaint><fillOn>false</fillOn></arc>
<arc type="componentData"><htmlId>64</htmlId><startAngle>179.8</startAngle><extentAngle>0.5</extentAngle><closed>false</closed><x>1500.0</x><y>195.6</y><top>95.0</top><bottom>95.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="139" g="92" b="246"/></strokePaint><fillOn>false</fillOn><data type="data"><action type="actionConnectTo"><property type="property" name="arc.extentAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>500.0</inputValueEnd><outputValueStart>0.5</outputValueStart><outputValueEnd>270.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.startAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>500.0</inputValueEnd><outputValueStart>179.75</outputValueStart><outputValueEnd>45.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></arc>
<number type="componentData"><htmlId>65</htmlId><value>0.0</value><format>9999</format><font type="font" name="Consolas" bold="true" size="26" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1500.0</x><y>191.1</y><top>18.0</top><bottom>18.0</bottom><left>81.0</left><right>81.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>66</htmlId><value>m3/h</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1500.0</x><y>223.5</y><top>9.0</top><bottom>9.0</bottom><left>40.0</left><right>40.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>67</htmlId><value>Inflow</value><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1500.0</x><y>306.2</y><top>10.0</top><bottom>10.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<arc type="componentData"><htmlId>68</htmlId><startAngle>45.0</startAngle><extentAngle>270.0</extentAngle><closed>false</closed><x>1745.0</x><y>195.6</y><top>95.0</top><bottom>95.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></strokePaint><fillOn>false</fillOn></arc>
<arc type="componentData"><htmlId>69</htmlId><startAngle>179.8</startAngle><extentAngle>0.5</extentAngle><closed>false</closed><x>1745.0</x><y>195.6</y><top>95.0</top><bottom>95.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="59" g="130" b="246"/></strokePaint><fillOn>false</fillOn><data type="data"><action type="actionConnectTo"><property type="property" name="arc.extentAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>200.0</inputValueEnd><outputValueStart>0.5</outputValueStart><outputValueEnd>270.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.CALC.VOLUME</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.startAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>200.0</inputValueEnd><outputValueStart>179.75</outputValueStart><outputValueEnd>45.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.CALC.VOLUME</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></arc>
<number type="componentData"><htmlId>70</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="26" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1745.0</x><y>191.1</y><top>18.0</top><bottom>18.0</bottom><left>81.0</left><right>81.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.CALC.VOLUME</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>71</htmlId><value>m3</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1745.0</x><y>223.5</y><top>9.0</top><bottom>9.0</bottom><left>40.0</left><right>40.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>72</htmlId><value>Volume</value><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1745.0</x><y>306.2</y><top>10.0</top><bottom>10.0</bottom><left>95.0</left><right>95.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>73</htmlId><roundingX>0.0270</roundingX><roundingY>0.0559</roundingY><x>1500.0</x><y>570.0</y><top>178.8</top><bottom>178.8</bottom><left>370.0</left><right>370.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>74</htmlId><value>LAST 10 MINUTES</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1195.3</x><y>416.9</y><top>11.0</top><bottom>11.0</bottom><left>45.3</left><right>45.3</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>75</htmlId><value>Micro trend: level (teal, 0-100 %) and inflow (violet, 0-500 m3/h)</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1284.5</x><y>439.2</y><top>9.0</top><bottom>9.0</bottom><left>134.5</left><right>134.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<microTrend type="componentData" x="1500.0" y="592.4" top="134.1" bottom="134.1" left="350.0" right="350.0" rotation="0.0" shear="0.0"><htmlId>76</htmlId><numberOfPens>2</numberOfPens><realTime>true</realTime><fillWithHistory>true</fillWithHistory><microTrendBackgroundFillOn>true</microTrendBackgroundFillOn><lowHighFillOn>false</lowHighFillOn><microTrendBackgroundFillColor type="colorSet" r="22" g="27" b="34"/><microTrendBackgroundColor type="colorSet" r="48" g="61" b="77"/><property type="componentProperty"><name>itemName[0]</name><value/></property><property type="componentProperty"><name>scaleMin[0]</name><value>0.0</value></property><property type="componentProperty"><name>scaleMax[0]</name><value>100.0</value></property><property type="componentProperty"><name>color[0]</name><value type="colorSet" r="20" g="184" b="166"/></property><property type="componentProperty"><name>stroke[0]</name><value type="stroke" width="2.0"/></property><property type="componentProperty"><name>itemName[1]</name><value/></property><property type="componentProperty"><name>scaleMin[1]</name><value>0.0</value></property><property type="componentProperty"><name>scaleMax[1]</name><value>500.0</value></property><property type="componentProperty"><name>color[1]</name><value type="colorSet" r="139" g="92" b="246"/></property><property type="componentProperty"><name>stroke[1]</name><value type="stroke" width="2.0"/></property><data type="data"><action type="actionInternalServiced"/><action type="actionConnectTo"><property type="property" name="microTrend.itemName[0]"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemName</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="microTrend.itemName[1]"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.INFLOW</itemName><itemAttribute>ItemName</itemAttribute></connection></action></data></microTrend>
</coreObjectDefinition>
</visualization>

View file

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8" ?>
<visualization protocolVersion="1.3.0.0">
<globalSection/>
<coreObjectDefinition type="displayDefinition">
<version type="version" value="1.3.0.0"/>
<title>System</title>
<html>true</html>
<width>1880</width>
<height>760</height>
<referenceCheck>60</referenceCheck>
<backgroundColor type="colorSet" r="13" g="17" b="23"/>
<backgroundColorOn>true</backgroundColorOn>
<defaultBgColor type="colorSet" r="13" g="17" b="23"/>
<defaultFgColor type="colorSet" r="230" g="237" b="243"/>
<defaultFont type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/>
<defaultStroke type="stroke" width="1.0"/>
<grid type="grid" gridVisible="true" snappingActive="true" verticalSnapInterval="4" horizontalSnapInterval="4" onTop="false"><color type="colorSet" r="51" g="59" b="71"/></grid>
<revisionHistory type="revisionHistory"><revision type="revision" who="ADMIN" when="2026.10.02 12:00:00.000 AEST" what="Generated by displays/generator/build.py" where="localhost"/></revisionHistory>
<blinkDelay>500</blinkDelay>
<blinkEnabled>true</blinkEnabled>
<mousePassThrough>false</mousePassThrough>
<visibilityGroup type="componentData"><htmlId>2</htmlId><name>Overview</name><description>Always shown</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>10.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>3</htmlId><name>Rough</name><description>Shown when viewing viewing a large area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>25.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>4</htmlId><name>Standard</name><description>Shown when using the default view setting</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>100.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>5</htmlId><name>Detail</name><description>Shown only when viewing a small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>400.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>6</htmlId><name>Intricacies</name><description>Shown only when viewing a very small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>1000.0</minimumZoomFactor></visibilityGroup>
<visualizationLayer type="componentData"><htmlId>1</htmlId><name>Layer1</name></visualizationLayer>
<componentCountHint>54</componentCountHint>
<rectangle type="componentData"><htmlId>7</htmlId><x>940.0</x><y>380.0</y><top>380.0</top><bottom>380.0</bottom><left>940.0</left><right>940.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="13" g="17" b="23"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>8</htmlId><roundingX>0.0333</roundingX><roundingY>0.0559</roundingY><x>310.0</x><y>190.0</y><top>178.8</top><bottom>178.8</bottom><left>300.0</left><right>300.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>9</htmlId><value>SERVER HEALTH</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>70.9</x><y>36.9</y><top>11.0</top><bottom>11.0</bottom><left>40.9</left><right>40.9</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>10</htmlId><value>Real values of this PC, written by the live-data feed</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>137.2</x><y>59.2</y><top>9.0</top><bottom>9.0</bottom><left>107.2</left><right>107.2</right><rotation>0.0</rotation><shear>0.0</shear></text>
<arc type="componentData"><htmlId>11</htmlId><startAngle>45.0</startAngle><extentAngle>270.0</extentAngle><closed>false</closed><x>160.0</x><y>201.2</y><top>100.0</top><bottom>100.0</bottom><left>100.0</left><right>100.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></strokePaint><fillOn>false</fillOn></arc>
<arc type="componentData"><htmlId>12</htmlId><startAngle>179.8</startAngle><extentAngle>0.5</extentAngle><closed>false</closed><x>160.0</x><y>201.2</y><top>100.0</top><bottom>100.0</bottom><left>100.0</left><right>100.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></strokePaint><fillOn>false</fillOn><data type="data"><action type="actionConnectTo"><property type="property" name="arc.extentAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>0.5</outputValueStart><outputValueEnd>270.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.CPU_LOAD</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.startAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>179.75</outputValueStart><outputValueEnd>45.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.CPU_LOAD</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.strokePaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.CPU_LOAD</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></arc>
<number type="componentData"><htmlId>13</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="26" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>160.0</x><y>196.7</y><top>18.0</top><bottom>18.0</bottom><left>86.0</left><right>86.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.CPU_LOAD</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>14</htmlId><value>%</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>160.0</x><y>229.1</y><top>9.0</top><bottom>9.0</bottom><left>40.0</left><right>40.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>15</htmlId><value>CPU load</value><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>160.0</x><y>317.4</y><top>10.0</top><bottom>10.0</bottom><left>100.0</left><right>100.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<arc type="componentData"><htmlId>16</htmlId><startAngle>45.0</startAngle><extentAngle>270.0</extentAngle><closed>false</closed><x>450.0</x><y>201.2</y><top>100.0</top><bottom>100.0</bottom><left>100.0</left><right>100.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="40" g="50" b="64"/></strokePaint><fillOn>false</fillOn></arc>
<arc type="componentData"><htmlId>17</htmlId><startAngle>179.8</startAngle><extentAngle>0.5</extentAngle><closed>false</closed><x>450.0</x><y>201.2</y><top>100.0</top><bottom>100.0</bottom><left>100.0</left><right>100.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="12.0" endCap="butt"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="59" g="130" b="246"/></strokePaint><fillOn>false</fillOn><data type="data"><action type="actionConnectTo"><property type="property" name="arc.extentAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>0.5</outputValueStart><outputValueEnd>270.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.DISK_C</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.startAngle"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationLinear"><inputType>java.lang.Double</inputType><outputType>java.lang.Double</outputType><inputValueStart>0.0</inputValueStart><inputValueEnd>100.0</inputValueEnd><outputValueStart>179.75</outputValueStart><outputValueEnd>45.0</outputValueEnd></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.DISK_C</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="arc.strokePaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.DISK_C</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></arc>
<number type="componentData"><htmlId>18</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="26" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>450.0</x><y>196.7</y><top>18.0</top><bottom>18.0</bottom><left>86.0</left><right>86.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.DISK_C</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>19</htmlId><value>%</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>450.0</x><y>229.1</y><top>9.0</top><bottom>9.0</bottom><left>40.0</left><right>40.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>20</htmlId><value>Disk C: used</value><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>450.0</x><y>317.4</y><top>10.0</top><bottom>10.0</bottom><left>100.0</left><right>100.0</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>21</htmlId><roundingX>0.0333</roundingX><roundingY>0.0559</roundingY><x>920.0</x><y>190.0</y><top>178.8</top><bottom>178.8</bottom><left>300.0</left><right>300.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>22</htmlId><value>COMMUNICATION AND PROCESSES</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>731.6</x><y>36.9</y><top>11.0</top><bottom>11.0</bottom><left>91.6</left><right>91.6</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>23</htmlId><roundingX>0.0214</roundingX><roundingY>0.2440</roundingY><x>920.0</x><y>91.6</y><top>24.6</top><bottom>24.6</bottom><left>280.0</left><right>280.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<ellipse type="componentData"><htmlId>24</htmlId><x>665.0</x><y>91.6</y><top>9.0</top><bottom>9.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.COMM_OK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>25</htmlId><value>Modbus station CIENG_PLC</value><font type="font" name="Segoe UI" size="13" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>765.5</x><y>91.6</y><top>10.0</top><bottom>10.0</bottom><left>77.5</left><right>77.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>26</htmlId><value>NORMAL</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1165.6</x><y>91.6</y><top>10.0</top><bottom>10.0</bottom><left>24.4</left><right>24.4</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.PLC1.COMM_OK</itemName><itemAttribute>ItemStatusMnemonic</itemAttribute></connection></action></data></text>
<rectangle type="componentData"><htmlId>27</htmlId><roundingX>0.0214</roundingX><roundingY>0.2440</roundingY><x>920.0</x><y>149.8</y><top>24.6</top><bottom>24.6</bottom><left>280.0</left><right>280.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<ellipse type="componentData"><htmlId>28</htmlId><x>665.0</x><y>149.8</y><top>9.0</top><bottom>9.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Boolean</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>false</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>true</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.UA.COMM_OK</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>29</htmlId><value>OPC UA client station CIENG_UA</value><font type="font" name="Segoe UI" size="13" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>778.7</x><y>149.8</y><top>10.0</top><bottom>10.0</bottom><left>90.7</left><right>90.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>30</htmlId><value>NORMAL</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1165.6</x><y>149.8</y><top>10.0</top><bottom>10.0</bottom><left>24.4</left><right>24.4</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.UA.COMM_OK</itemName><itemAttribute>ItemStatusMnemonic</itemAttribute></connection></action></data></text>
<rectangle type="componentData"><htmlId>31</htmlId><roundingX>0.0214</roundingX><roundingY>0.2440</roundingY><x>920.0</x><y>207.9</y><top>24.6</top><bottom>24.6</bottom><left>280.0</left><right>280.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<ellipse type="componentData"><htmlId>32</htmlId><x>665.0</x><y>207.9</y><top>9.0</top><bottom>9.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="71" g="85" b="105"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut><thresholdIn>0.5</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.UA.SRV_STATE</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>33</htmlId><value>OPC UA server state (0 = running)</value><font type="font" name="Segoe UI" size="13" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>784.5</x><y>207.9</y><top>10.0</top><bottom>10.0</bottom><left>96.5</left><right>96.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>34</htmlId><value>NORMAL</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1165.6</x><y>207.9</y><top>10.0</top><bottom>10.0</bottom><left>24.4</left><right>24.4</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.UA.SRV_STATE</itemName><itemAttribute>ItemStatusMnemonic</itemAttribute></connection></action></data></text>
<rectangle type="componentData"><htmlId>35</htmlId><roundingX>0.0214</roundingX><roundingY>0.2440</roundingY><x>920.0</x><y>266.0</y><top>24.6</top><bottom>24.6</bottom><left>280.0</left><right>280.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<ellipse type="componentData"><htmlId>36</htmlId><x>665.0</x><y>266.0</y><top>9.0</top><bottom>9.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="71" g="85" b="105"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>0.5</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.PING_LOCALHOST</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>37</htmlId><value>localhost reachable</value><font type="font" name="Segoe UI" size="13" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>743.1</x><y>266.0</y><top>10.0</top><bottom>10.0</bottom><left>55.1</left><right>55.1</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>38</htmlId><value>NORMAL</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1165.6</x><y>266.0</y><top>10.0</top><bottom>10.0</bottom><left>24.4</left><right>24.4</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.PING_LOCALHOST</itemName><itemAttribute>ItemStatusMnemonic</itemAttribute></connection></action></data></text>
<rectangle type="componentData"><htmlId>39</htmlId><roundingX>0.0214</roundingX><roundingY>0.2440</roundingY><x>920.0</x><y>324.1</y><top>24.6</top><bottom>24.6</bottom><left>280.0</left><right>280.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<ellipse type="componentData"><htmlId>40</htmlId><x>665.0</x><y>324.1</y><top>9.0</top><bottom>9.0</bottom><left>9.0</left><right>9.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="71" g="85" b="105"/></fillPaint><data type="data"><action type="actionConnectTo"><property type="property" name="ellipse.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>0.5</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="34" g="197" b="94"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.PROC_ALM</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></ellipse>
<text type="componentData"><htmlId>41</htmlId><value>ALARM process (alm) running</value><font type="font" name="Segoe UI" size="13" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>772.3</x><y>324.1</y><top>10.0</top><bottom>10.0</bottom><left>84.3</left><right>84.3</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>42</htmlId><value>NORMAL</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1165.6</x><y>324.1</y><top>10.0</top><bottom>10.0</bottom><left>24.4</left><right>24.4</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.SYSTEM.PROC_ALM</itemName><itemAttribute>ItemStatusMnemonic</itemAttribute></connection></action></data></text>
<rectangle type="componentData"><htmlId>43</htmlId><roundingX>0.0312</roundingX><roundingY>0.0559</roundingY><x>1550.0</x><y>190.0</y><top>178.8</top><bottom>178.8</bottom><left>320.0</left><right>320.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>44</htmlId><value>OPC UA LOOPBACK</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1299.7</x><y>36.9</y><top>11.0</top><bottom>11.0</bottom><left>49.7</left><right>49.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>45</htmlId><value>TANK1.LEVEL read back through CI Server's own OPC UA server</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1385.5</x><y>59.2</y><top>9.0</top><bottom>9.0</bottom><left>135.5</left><right>135.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>46</htmlId><value>TANK1.LEVEL</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1290.7</x><y>87.2</y><top>8.0</top><bottom>8.0</bottom><left>30.7</left><right>30.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>47</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="32" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="20" g="184" b="166"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1303.9</x><y>125.2</y><top>22.0</top><bottom>22.0</bottom><left>43.9</left><right>43.9</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<dataBar type="componentData" x="1390.0" y="177.7" top="9.0" bottom="9.0" left="130.0" right="130.0" rotation="0.0" shear="0.0"><htmlId>48</htmlId><fillOn>true</fillOn><background type="paint"><paint type="colorSet" r="40" g="50" b="64"/></background><foreground type="paint"><paint type="colorSet" r="20" g="184" b="166"/></foreground><borderColor type="paint"><paint type="colorSet" r="40" g="50" b="64"/></borderColor><foregroundBorderColor type="paint"><paint type="colorSet" r="20" g="184" b="166"/></foregroundBorderColor><lowLimit>0.0</lowLimit><highLimit>100.0</highLimit><growthDirection type="growthDirection" value="GrowthDirectionRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="dataBar.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></dataBar>
<text type="componentData"><htmlId>49</htmlId><value>LAST UPDATE</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1291.7</x><y>212.4</y><top>8.0</top><bottom>8.0</bottom><left>31.7</left><right>31.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<numberField type="componentData" x="1390.0" y="241.4" top="14.0" bottom="14.0" left="130.0" right="130.0" rotation="0.0" shear="0.0"><htmlId>50</htmlId><font type="font" name="Consolas" bold="true" size="13" underline="false" strikethrough="false"/><format></format><editable>false</editable><asDateTime>true</asDateTime><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><justification type="jTextJustification" value="TextJustificationRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="numberField.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemUpdTime</itemAttribute></connection></action></data></numberField>
<text type="componentData"><htmlId>51</htmlId><value>UA.LEVEL_COPY</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1596.1</x><y>87.2</y><top>8.0</top><bottom>8.0</bottom><left>36.1</left><right>36.1</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>52</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="32" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="59" g="130" b="246"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1603.9</x><y>125.2</y><top>22.0</top><bottom>22.0</bottom><left>43.9</left><right>43.9</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.UA.LEVEL_COPY</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<dataBar type="componentData" x="1690.0" y="177.7" top="9.0" bottom="9.0" left="130.0" right="130.0" rotation="0.0" shear="0.0"><htmlId>53</htmlId><fillOn>true</fillOn><background type="paint"><paint type="colorSet" r="40" g="50" b="64"/></background><foreground type="paint"><paint type="colorSet" r="59" g="130" b="246"/></foreground><borderColor type="paint"><paint type="colorSet" r="40" g="50" b="64"/></borderColor><foregroundBorderColor type="paint"><paint type="colorSet" r="59" g="130" b="246"/></foregroundBorderColor><lowLimit>0.0</lowLimit><highLimit>100.0</highLimit><growthDirection type="growthDirection" value="GrowthDirectionRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="dataBar.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.UA.LEVEL_COPY</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></dataBar>
<text type="componentData"><htmlId>54</htmlId><value>LAST UPDATE</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>1591.7</x><y>212.4</y><top>8.0</top><bottom>8.0</bottom><left>31.7</left><right>31.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<numberField type="componentData" x="1690.0" y="241.4" top="14.0" bottom="14.0" left="130.0" right="130.0" rotation="0.0" shear="0.0"><htmlId>55</htmlId><font type="font" name="Consolas" bold="true" size="13" underline="false" strikethrough="false"/><format></format><editable>false</editable><asDateTime>true</asDateTime><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><justification type="jTextJustification" value="TextJustificationRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="numberField.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.UA.LEVEL_COPY</itemName><itemAttribute>ItemUpdTime</itemAttribute></connection></action></data></numberField>
<rectangularScale type="componentData" x="1540.0" y="298.4" top="17.0" bottom="17.0" left="280.0" right="280.0" rotation="0.0" shear="0.0"><htmlId>56</htmlId><maximum>100.0</maximum><minimum>0.0</minimum><majorTickSpacing>10.0</majorTickSpacing><minorTickSpacing>5.0</minorTickSpacing><format>999</format><vertical>false</vertical><color type="colorSet" r="139" g="152" b="168"/><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/></rectangularScale>
<rectangle type="componentData"><htmlId>57</htmlId><roundingX>0.0108</roundingX><roundingY>0.0542</roundingY><x>940.0</x><y>564.4</y><top>184.4</top><bottom>184.4</bottom><left>930.0</left><right>930.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>true</strokeOn><strokePaint type="paint"><paint type="colorSet" r="48" g="61" b="77"/></strokePaint><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<text type="componentData"><htmlId>58</htmlId><value>REPORTS</value><font type="font" name="Segoe UI" bold="true" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>52.9</x><y>405.7</y><top>11.0</top><bottom>11.0</bottom><left>22.9</left><right>22.9</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>59</htmlId><value>Report component: select CIENG_TANK1 or CIENG_HTML, generate and view</value><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="88" g="100" b="116"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>193.3</x><y>428.1</y><top>9.0</top><bottom>9.0</bottom><left>163.3</left><right>163.3</right><rotation>0.0</rotation><shear>0.0</shear></text>
<reporting type="componentData" x="940.0" y="586.8" top="150.9" bottom="150.9" left="920.0" right="920.0" rotation="0.0" shear="0.0"><htmlId>60</htmlId><data type="data"><action type="actionInternalServiced"/></data></reporting>
</coreObjectDefinition>
</visualization>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8" ?>
<visualization protocolVersion="1.3.0.0">
<globalSection/>
<coreObjectDefinition type="displayDefinition">
<version type="version" value="1.3.0.0"/>
<title>Tank 1 faceplate</title>
<html>true</html>
<width>420</width>
<height>600</height>
<referenceCheck>42</referenceCheck>
<backgroundColor type="colorSet" r="28" g="35" b="45"/>
<backgroundColorOn>true</backgroundColorOn>
<defaultBgColor type="colorSet" r="28" g="35" b="45"/>
<defaultFgColor type="colorSet" r="230" g="237" b="243"/>
<defaultFont type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/>
<defaultStroke type="stroke" width="1.0"/>
<grid type="grid" gridVisible="true" snappingActive="true" verticalSnapInterval="4" horizontalSnapInterval="4" onTop="false"><color type="colorSet" r="51" g="59" b="71"/></grid>
<revisionHistory type="revisionHistory"><revision type="revision" who="ADMIN" when="2026.10.02 12:00:00.000 AEST" what="Generated by displays/generator/build.py" where="localhost"/></revisionHistory>
<blinkDelay>500</blinkDelay>
<blinkEnabled>true</blinkEnabled>
<mousePassThrough>false</mousePassThrough>
<visibilityGroup type="componentData"><htmlId>2</htmlId><name>Overview</name><description>Always shown</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>10.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>3</htmlId><name>Rough</name><description>Shown when viewing viewing a large area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>25.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>4</htmlId><name>Standard</name><description>Shown when using the default view setting</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>100.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>5</htmlId><name>Detail</name><description>Shown only when viewing a small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>400.0</minimumZoomFactor></visibilityGroup>
<visibilityGroup type="componentData"><htmlId>6</htmlId><name>Intricacies</name><description>Shown only when viewing a very small area</description><minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>1000.0</minimumZoomFactor></visibilityGroup>
<visualizationLayer type="componentData"><htmlId>1</htmlId><name>Layer1</name></visualizationLayer>
<componentCountHint>36</componentCountHint>
<rectangle type="componentData"><htmlId>7</htmlId><x>210.0</x><y>300.0</y><top>300.0</top><bottom>300.0</bottom><left>210.0</left><right>210.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="28" g="35" b="45"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>8</htmlId><x>210.0</x><y>26.0</y><top>26.0</top><bottom>26.0</bottom><left>210.0</left><right>210.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="36" g="45" b="57"/></fillPaint></rectangle>
<text type="componentData"><htmlId>9</htmlId><value>TANK 1 | LEVEL</value><font type="font" name="Segoe UI" bold="true" size="15" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>77.5</x><y>26.0</y><top>12.0</top><bottom>12.0</bottom><left>57.5</left><right>57.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<button type="componentData" x="388.0" y="26.0" top="16.0" bottom="16.0" left="18.0" right="18.0" rotation="0.0" shear="0.0"><htmlId>10</htmlId><toolTipText>Close</toolTipText><label>X</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="28" g="35" b="45"/><data type="data"><action type="actionExitDisplay"><event type="event" event="On action"/></action></data></button>
<text type="componentData"><htmlId>11</htmlId><value>Tank 1 level (%)</value><font type="font" name="Segoe UI" size="11" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>57.0</x><y>73.0</y><top>9.0</top><bottom>9.0</bottom><left>37.0</left><right>37.0</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemDesc</itemAttribute></connection></action></data></text>
<number type="componentData"><htmlId>12</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="44" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>78.5</x><y>114.0</y><top>28.0</top><bottom>28.0</bottom><left>58.5</left><right>58.5</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="number.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>13</htmlId><value>%</value><font type="font" name="Segoe UI" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>230.3</x><y>118.0</y><top>12.0</top><bottom>12.0</bottom><left>6.3</left><right>6.3</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>14</htmlId><value>STATUS</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>381.5</x><y>100.0</y><top>8.0</top><bottom>8.0</bottom><left>18.5</left><right>18.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<text type="componentData"><htmlId>15</htmlId><value>NORMAL</value><font type="font" name="Segoe UI" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>366.4</x><y>123.0</y><top>13.0</top><bottom>13.0</bottom><left>33.6</left><right>33.6</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="text.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemStatusMnemonic</itemAttribute></connection></action><action type="actionConnectTo"><property type="property" name="text.fillPaint"/><filter type="filter"><value>0.0</value></filter><transformation type="transformationThreshold"><inputType>java.lang.Double</inputType><outputType>fasttools.jwui.common.property.paint.PaintSet</outputType><thresholdTable type="thresholdTable"><thresholdIn>0.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut><thresholdIn>10.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>20.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="20" g="184" b="166"/></thresholdOut><thresholdIn>80.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="245" g="158" b="11"/></thresholdOut><thresholdIn>90.0</thresholdIn><thresholdOut type="paint"><paint type="colorSet" r="239" g="68" b="68"/></thresholdOut></thresholdTable></transformation><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></text>
<dataBar type="componentData" x="70.0" y="300.0" top="140.0" bottom="140.0" left="30.0" right="30.0" rotation="0.0" shear="0.0"><htmlId>16</htmlId><fillOn>true</fillOn><background type="paint"><paint type="colorSet" r="40" g="50" b="64"/></background><foreground type="paint"><paint type="colorSet" r="59" g="130" b="246"/></foreground><borderColor type="paint"><paint type="colorSet" r="40" g="50" b="64"/></borderColor><foregroundBorderColor type="paint"><paint type="colorSet" r="59" g="130" b="246"/></foregroundBorderColor><lowLimit>0.0</lowLimit><highLimit>100.0</highLimit><growthDirection type="growthDirection" value="GrowthDirectionUp"/><data type="data"><action type="actionConnectTo"><property type="property" name="dataBar.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></dataBar>
<rectangularScale type="componentData" x="126.0" y="300.0" top="140.0" bottom="140.0" left="22.0" right="22.0" rotation="0.0" shear="0.0"><htmlId>17</htmlId><maximum>100.0</maximum><minimum>0.0</minimum><majorTickSpacing>20.0</majorTickSpacing><minorTickSpacing>5.0</minorTickSpacing><format>999</format><vertical>true</vertical><color type="colorSet" r="139" g="152" b="168"/><font type="font" name="Segoe UI" size="10" underline="false" strikethrough="false"/></rectangularScale>
<text type="componentData"><htmlId>18</htmlId><value>ALARM LIMITS</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>225.1</x><y>168.0</y><top>8.0</top><bottom>8.0</bottom><left>35.1</left><right>35.1</right><rotation>0.0</rotation><shear>0.0</shear></text>
<rectangle type="componentData"><htmlId>19</htmlId><roundingX>0.0571</roundingX><roundingY>0.3529</roundingY><x>295.0</x><y>203.0</y><top>17.0</top><bottom>17.0</bottom><left>105.0</left><right>105.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>20</htmlId><x>193.0</x><y>203.0</y><top>17.0</top><bottom>17.0</bottom><left>3.0</left><right>3.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint></rectangle>
<text type="componentData"><htmlId>21</htmlId><value>High-High</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>233.8</x><y>203.0</y><top>9.0</top><bottom>9.0</bottom><left>27.8</left><right>27.8</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>22</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>368.1</x><y>203.0</y><top>13.0</top><bottom>13.0</bottom><left>21.9</left><right>21.9</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemHHL</itemAttribute></connection></action></data></number>
<rectangle type="componentData"><htmlId>23</htmlId><roundingX>0.0571</roundingX><roundingY>0.3529</roundingY><x>295.0</x><y>243.0</y><top>17.0</top><bottom>17.0</bottom><left>105.0</left><right>105.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>24</htmlId><x>193.0</x><y>243.0</y><top>17.0</top><bottom>17.0</bottom><left>3.0</left><right>3.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint></rectangle>
<text type="componentData"><htmlId>25</htmlId><value>High</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>218.7</x><y>243.0</y><top>9.0</top><bottom>9.0</bottom><left>12.7</left><right>12.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>26</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>368.1</x><y>243.0</y><top>13.0</top><bottom>13.0</bottom><left>21.9</left><right>21.9</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemHL</itemAttribute></connection></action></data></number>
<rectangle type="componentData"><htmlId>27</htmlId><roundingX>0.0571</roundingX><roundingY>0.3529</roundingY><x>295.0</x><y>283.0</y><top>17.0</top><bottom>17.0</bottom><left>105.0</left><right>105.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>28</htmlId><x>193.0</x><y>283.0</y><top>17.0</top><bottom>17.0</bottom><left>3.0</left><right>3.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint></rectangle>
<text type="componentData"><htmlId>29</htmlId><value>Low</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>216.7</x><y>283.0</y><top>9.0</top><bottom>9.0</bottom><left>10.7</left><right>10.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>30</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="245" g="158" b="11"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>368.1</x><y>283.0</y><top>13.0</top><bottom>13.0</bottom><left>21.9</left><right>21.9</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemLL</itemAttribute></connection></action></data></number>
<rectangle type="componentData"><htmlId>31</htmlId><roundingX>0.0571</roundingX><roundingY>0.3529</roundingY><x>295.0</x><y>323.0</y><top>17.0</top><bottom>17.0</bottom><left>105.0</left><right>105.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="22" g="27" b="34"/></fillPaint></rectangle>
<rectangle type="componentData"><htmlId>32</htmlId><x>193.0</x><y>323.0</y><top>17.0</top><bottom>17.0</bottom><left>3.0</left><right>3.0</right><rotation>0.0</rotation><shear>0.0</shear><stroke type="stroke" width="1.0"/><strokeOn>false</strokeOn><fillOn>true</fillOn><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint></rectangle>
<text type="componentData"><htmlId>33</htmlId><value>Low-Low</value><font type="font" name="Segoe UI" size="12" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>229.9</x><y>323.0</y><top>9.0</top><bottom>9.0</bottom><left>23.9</left><right>23.9</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>34</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="16" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="239" g="68" b="68"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>368.1</x><y>323.0</y><top>13.0</top><bottom>13.0</bottom><left>21.9</left><right>21.9</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemLLL</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>35</htmlId><value>MAXIMUM SEEN</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>229.5</x><y>360.0</y><top>8.0</top><bottom>8.0</bottom><left>39.5</left><right>39.5</right><rotation>0.0</rotation><shear>0.0</shear></text>
<number type="componentData"><htmlId>36</htmlId><value>0.0</value><format>999.9</format><font type="font" name="Consolas" bold="true" size="22" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="230" g="237" b="243"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>219.2</x><y>386.0</y><top>16.0</top><bottom>16.0</bottom><left>29.2</left><right>29.2</right><rotation>0.0</rotation><shear>0.0</shear><data type="data"><action type="actionConnectTo"><property type="property" name="number.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL.MAX</itemName><itemAttribute>ItemValue</itemAttribute></connection></action></data></number>
<text type="componentData"><htmlId>37</htmlId><value>LAST UPDATE</value><font type="font" name="Segoe UI" bold="true" size="10" underline="false" strikethrough="false"/><fillPaint type="paint"><paint type="colorSet" r="139" g="152" b="168"/></fillPaint><justification type="textJustification" value="TextJustificationCenter"/><stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize><x>221.7</x><y>420.0</y><top>8.0</top><bottom>8.0</bottom><left>31.7</left><right>31.7</right><rotation>0.0</rotation><shear>0.0</shear></text>
<numberField type="componentData" x="295.0" y="442.0" top="12.0" bottom="12.0" left="105.0" right="105.0" rotation="0.0" shear="0.0"><htmlId>38</htmlId><font type="font" name="Consolas" bold="true" size="11" underline="false" strikethrough="false"/><format></format><editable>false</editable><asDateTime>true</asDateTime><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><justification type="jTextJustification" value="TextJustificationRight"/><data type="data"><action type="actionConnectTo"><property type="property" name="numberField.value"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemUpdTime</itemAttribute></connection></action></data></numberField>
<microTrend type="componentData" x="210.0" y="500.0" top="40.0" bottom="40.0" left="190.0" right="190.0" rotation="0.0" shear="0.0"><htmlId>39</htmlId><numberOfPens>1</numberOfPens><realTime>true</realTime><fillWithHistory>true</fillWithHistory><microTrendBackgroundFillOn>true</microTrendBackgroundFillOn><lowHighFillOn>false</lowHighFillOn><microTrendBackgroundFillColor type="colorSet" r="22" g="27" b="34"/><microTrendBackgroundColor type="colorSet" r="48" g="61" b="77"/><property type="componentProperty"><name>itemName[0]</name><value/></property><property type="componentProperty"><name>scaleMin[0]</name><value>0.0</value></property><property type="componentProperty"><name>scaleMax[0]</name><value>100.0</value></property><property type="componentProperty"><name>color[0]</name><value type="colorSet" r="20" g="184" b="166"/></property><property type="componentProperty"><name>stroke[0]</name><value type="stroke" width="2.0"/></property><data type="data"><action type="actionInternalServiced"/><action type="actionConnectTo"><property type="property" name="microTrend.itemName[0]"/><filter type="filter"><value>0.0</value></filter><connection type="connection"><direction>1</direction><itemName>CI-Eng-Sample.TANK1.LEVEL</itemName><itemAttribute>ItemName</itemAttribute></connection></action></data></microTrend>
<button type="componentData" x="80.0" y="569.0" top="17.0" bottom="17.0" left="60.0" right="60.0" rotation="0.0" shear="0.0"><htmlId>40</htmlId><label>Trends</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><data type="data"><action type="actionActivateDisplay"><event type="event" event="On action"/><type type="displayActivationType" value="ActivateSpecific"/><display>CIENG_Trends</display><layout>CIENG_Operator</layout><layoutFrame>trd</layoutFrame></action></data></button>
<button type="componentData" x="210.0" y="569.0" top="17.0" bottom="17.0" left="60.0" right="60.0" rotation="0.0" shear="0.0"><htmlId>41</htmlId><label>Alarms</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="230" g="237" b="243"/><backgroundColor type="colorSet" r="36" g="45" b="57"/><data type="data"><action type="actionActivateDisplay"><event type="event" event="On action"/><type type="displayActivationType" value="ActivateSpecific"/><display>CIENG_Alarms</display><layout>CIENG_Operator</layout><layoutFrame>alm</layoutFrame></action></data></button>
<button type="componentData" x="340.0" y="569.0" top="17.0" bottom="17.0" left="60.0" right="60.0" rotation="0.0" shear="0.0"><htmlId>42</htmlId><label>Close</label><font type="font" name="Segoe UI" bold="true" size="12" underline="false" strikethrough="false"/><foregroundColor type="colorSet" r="255" g="255" b="255"/><backgroundColor type="colorSet" r="59" g="130" b="246"/><data type="data"><action type="actionExitDisplay"><event type="event" event="On action"/></action></data></button>
</coreObjectDefinition>
</visualization>

File diff suppressed because one or more lines are too long

View file

@ -3,12 +3,11 @@ rem Deploy the CI-Eng-Sample displays into the operator interface (deployment DE
rem CI Server R1.03.00. Load the sample (load.cmd) first; no admin rights needed.
rem Copies the display XML, then creates the HTML (Mobile Operator) version with jwuiutl;
rem without -o the HTML goes to %TLS_WAP_PATH%\mobileoperator\operatorInterfaces\DEPLOY.
rem The files are generated by generator\build.py (already in this folder; rerun only after changes).
cd /d "%~dp0"
set WAP=%TLS_WAP_PATH%
if not defined TLS_WAP_PATH set WAP=C:\Users\Public\Yokogawa\tls\wap
copy /y CIENG_Tank.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\"
copy /y CIENG_Menu.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\"
copy /y CIENG_TrendLab.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\"
call jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_Tank
call jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_Menu
call jwuiutl.cmd -e HTML -i -f DEPLOY CIENG_TrendLab
for %%d in (CIENG_Header CIENG_Overview CIENG_Control CIENG_Trends CIENG_Alarms CIENG_System CIENG_AlarmBanner CIENG_TankFaceplate) do (
copy /y %%d.xml "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\" > nul
call jwuiutl.cmd -e HTML -i -f DEPLOY %%d
)

View file

@ -0,0 +1 @@
__pycache__/

View file

@ -0,0 +1,44 @@
# Display generator (CI-Eng-Sample operator HMI)
A small Python tool that **writes the CI-Eng-Sample display files** (`..\CIENG_*.xml`) instead of
drawing them in the Edit Module. The XML is the same format the Edit Module saves (display
definition 1.3.0.0, *HTML display* on), so the files run in the Operator Interface (desktop) and in
the HTML display (web), and they can still be opened and changed in the Edit Module afterwards
(but a later generator run overwrites such changes).
Built and tested with CI Server R1.03.00, Python 3.12 and Pillow, 2026-10-06.
## Files
| File | Purpose |
|---|---|
| `cixml.py` | Library: a `Display` class with one method per component (rectangle, text, number, number/text/date-time field, button, toggle, check box, slider, spinner, combo box, data bar, scales, arc / ring gauge, lamp, alarm overview, report, micro trend, trend), item connections, linear and threshold transformations, actions (open / close display, set item value, execute command) and the dark colour theme |
| `build.py` | The eight sample displays: `CIENG_Header`, `CIENG_Overview`, `CIENG_Control`, `CIENG_Trends`, `CIENG_Alarms`, `CIENG_System`, `CIENG_AlarmBanner` (layout `CIENG_Operator`) and `CIENG_TankFaceplate` (layout `CIENG_Popup`) |
## Use
```
python build.py (writes ..\CIENG_*.xml)
python build.py <folder> (writes into another folder)
```
Then deploy with `..\deploy_displays.cmd`. Requirements: Python 3, Pillow (`pip install pillow`;
used to measure text widths with the Windows fonts Segoe UI and Consolas). Without Pillow it falls
back to an estimate and left/right-aligned texts land slightly off.
## How it works (rules learned on R1.03.00)
- Positions are boxes (left, top, width, height); the file stores the centre plus half sizes.
- Texts and numbers use *keep original size*: the HTML export draws them at their font size centred
on the box (otherwise the text is stretched to the box). The box is therefore shrunk to the
measured text width for left / right alignment.
- Rectangle rounding is stored as a fraction (0..1) of the half size (values above 1 draw an
ellipse in the web client).
- The tab displays are designed 1880 x 680 and stretched to 1880 x 760 (`design_h`): panels, bars,
lists and trends grow, texts / controls / round shapes keep their size and only move.
- Ring gauges are symmetric about the horizontal axis (gap on the right, value growing from 9
o'clock up and down) because the desktop draws arc angles mirrored compared with the web.
- The live-data button runs `C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd` on the
server (`FEED_START` in `build.py`; installed by `..\..\feed\install_feed.ps1`).
- Trend: `trend(..., web_spares=True)` pads a trend to 50 pens so it also draws on the web; the
sample trend uses `web_spares=False` (2 pens, clean desktop hairline, no line on the web).

View file

@ -0,0 +1,351 @@
"""Build the CI-Eng-Sample demo displays (CI Server R1.03.00, HTML mode = desktop + web).
python build.py [<output folder>] (default: the displays folder, ..)
See README.md in this folder.
Displays: CIENG_Header, CIENG_Overview, CIENG_Control, CIENG_Trends, CIENG_Alarms, CIENG_System,
CIENG_AlarmBanner (frames of layout CIENG_Operator) and CIENG_TankFaceplate (layout CIENG_Popup).
"""
import os, sys
sys.path.insert(0, os.path.dirname(__file__))
from cixml import *
S = 'CI-Eng-Sample.'
LEVEL, INFLOW, VOLUME = S + 'TANK1.LEVEL', S + 'TANK1.INFLOW', S + 'TANK1.CALC.VOLUME'
LVL_COLORS = [(0, 'red'), (10, 'amber'), (20, 'teal'), (80, 'amber'), (90, 'red')] # LL/L/normal/H/HH
# live-data feed, installed by feed\install_feed.ps1 into a fixed folder outside CI Server
FEED_START = r'cmd /c "C:\Users\Public\CI-Eng-Sample\feed\cieng_feed_start.cmd"'
W, H, HD = 1880, 760, 680 # content displays (tab frames): 1880 x 760 (about 2.5:1, between the
# 16:9 and 16:10 content areas); coordinates below are designed for 680 high
FACEPLATE = act_open('CIENG_TankFaceplate', 'CIENG_Popup', 'default')
FACEPLATE_CLICK = act_open('CIENG_TankFaceplate', 'CIENG_Popup', 'default', event='Clicked b1')
def card(d, l, t, w, h, title, sub=None):
d.rect(l, t, w, h, fill='card', stroke='line', r=10)
d.text(l + 20, t + 12, w - 40, 22, title.upper(), 11, 'muted', bold=True)
if sub:
d.text(l + 20, t + 34, w - 40, 18, sub, 10, 'dim')
def kv(d, l, t, w, label, item, fmt, unit, size=22, color='text', extra=()):
d.text(l, t, w, 16, label, 10, 'muted')
d.number(l, t + 18, w - 50, 30, item, fmt, size, color, align='Left', extra=extra)
d.text(l + w - 48, t + 26, 48, 18, unit, 11, 'muted')
def level_color(prop='number.fillPaint'):
return conn(prop, LEVEL, transform=tr_threshold(LVL_COLORS))
def gauge(d, cx, cy, r, item, mn, mx, fmt, unit, label, color='teal', thresholds=None, extra=()):
d.ring_gauge(cx, cy, r, item, mn, mx, color, 12, thresholds)
d.number(cx - r + 14, cy - 22, 2 * r - 28, 36, item, fmt, 26, align='Center', extra=extra)
d.text(cx - 40, cy + 16, 80, 18, unit, 11, 'muted', align='Center')
d.text(cx - r, cy + r - 6, 2 * r, 20, label, 12, 'text', bold=True, align='Center')
def build_header():
d = Display('CIENG_Header', 1920, 96, 'Header', bg='panel')
d.rect(0, 0, 1920, 96, fill='panel')
d.line(0, 95, 1920, 95, 'line', 1)
d.rect(20, 18, 60, 60, fill='blue', r=14)
d.text(20, 34, 60, 28, 'CI', 22, 'white', bold=True, align='Center')
d.text(96, 18, 380, 30, 'CI-Eng-Sample', 22, 'text', bold=True)
d.text(96, 52, 400, 20, 'Operations dashboard | Tank farm demo', 12, 'muted')
# KPI chips
chips = [(520, 'TANK LEVEL', LEVEL, '999.9', '%', [level_color()]),
(700, 'INFLOW', INFLOW, '9999.9', 'm3/h', []),
(880, 'VOLUME', VOLUME, '9999.9', 'm3', [])]
for x, label, item, fmt, unit, extra in chips:
d.rect(x, 14, 168, 68, fill='card', stroke='line', r=8)
d.text(x + 14, 22, 140, 16, label, 10, 'muted', bold=True)
d.number(x + 14, 40, 100, 32, item, fmt, 22, align='Left', extra=extra)
d.text(x + 118, 50, 46, 18, unit, 11, 'muted')
x = 1060
d.rect(x, 14, 168, 68, fill='card', stroke='line', r=8)
d.text(x + 14, 22, 140, 16, 'PUMP 1', 10, 'muted', bold=True)
d.lamp(x + 14, 48, 18, S + 'PUMP1.RUNNING')
for txt, col, on in (('RUNNING', 'green', True), ('STOPPED', 'muted', False)):
d.text(x + 40, 44, 120, 24, txt, 14, col, bold=True)
d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.visible', S + 'PUMP1.RUNNING',
transform=tr_threshold([(False, not on), (True, on)], 'Boolean', 'Boolean'))]) + '</text>')
x = 1240
d.rect(x, 14, 168, 68, fill='card', stroke='line', r=8)
d.text(x + 14, 22, 140, 16, 'COMMUNICATION', 10, 'muted', bold=True)
d.lamp(x + 14, 50, 14, S + 'PLC1.COMM_OK', off='red')
d.text(x + 34, 46, 50, 20, 'PLC1', 12, 'text')
d.lamp(x + 90, 50, 14, S + 'UA.COMM_OK', off='red')
d.text(x + 110, 46, 50, 20, 'OPC UA', 12, 'text')
# live data start/stop
x = 1424
d.rect(x, 14, 250, 68, fill='card', stroke='line', r=8)
d.text(x + 14, 22, 120, 16, 'LIVE DATA', 10, 'muted', bold=True)
d.lamp(x + 112, 23, 12, S + 'DEMO.FEED_ON')
d.button(x + 14, 44, 104, 30, 'Start', [act_set(S + 'DEMO.FEED_ON', 1), act_cmd(FEED_START)], fg='white', bg='green',
tip='Start the live-data feed (cieng_feed.ps1) on the server')
d.button(x + 130, 44, 104, 30, 'Stop', [act_set(S + 'DEMO.FEED_ON', 0)], fg='text', bg='card2',
tip='Stop the feed (ends within 5 s)')
# faceplate + clock
d.button(1688, 14, 92, 68, 'Tank 1', [FACEPLATE], fg='white', bg='blue', tip='Open the Tank 1 faceplate popup')
d.text(1792, 22, 120, 16, 'LAST UPDATE', 10, 'muted', bold=True)
d.time_text(1792, 44, 122, 28, S + 'DEMO.COUNTER', 9)
return d
def build_overview():
d = Display('CIENG_Overview', W, H, 'Overview', design_h=HD)
d.rect(0, 0, W, HD, fill='bg')
card(d, 10, 10, 1110, 660, 'Process - Tank 1', 'Click the tank for its faceplate')
# inflow pipe + flow indicator
d.rect(60, 330, 380, 16, fill='track')
d.rect(60, 333, 380, 10, fill='teal', actions=[conn('rectangle.visible', INFLOW,
transform=tr_threshold([(0, False), (5, True)], 'Double', 'Boolean'))])
d.text(60, 250, 200, 16, 'INFLOW', 10, 'muted', bold=True)
d.number(60, 268, 150, 40, INFLOW, '9999.9', 30, align='Left')
d.text(214, 282, 60, 20, 'm3/h', 12, 'muted')
# tank
d.rect(440, 100, 240, 480, fill='panel', stroke='line', sw=2, r=18, actions=[FACEPLATE_CLICK],
tip='Tank 1 - click for the faceplate')
d.rect(450, 110, 220, 460, fill='blue', r=12, fill_amount=0.5, fill_dir='FillDirectionUp',
actions=[conn('rectangle.fillAmount', LEVEL, transform=tr_linear(0, 100, 0, 1)),
conn('rectangle.fillPaint', LEVEL, transform=tr_threshold(
[(0, (185, 28, 28)), (10, (180, 83, 9)), (20, (37, 99, 235)), (80, (180, 83, 9)), (90, (185, 28, 28))])),
FACEPLATE_CLICK])
d.text(450, 60, 220, 28, 'TANK 1', 16, 'text', bold=True, align='Center')
d.number(460, 300, 200, 50, LEVEL, '999.9', 40, 'white', align='Center')
d.text(460, 352, 200, 20, '% level', 12, 'text', align='Center')
for pct, lab, col in ((90, 'HH 90', 'red'), (80, 'H 80', 'amber'), (20, 'L 20', 'amber'), (10, 'LL 10', 'red')):
y = 570 - pct * 4.6
d.line(682, y, 700, y, col, 2)
d.text(706, y - 9, 60, 18, lab, 10, col, bold=True)
d.button(470, 594, 180, 32, 'Open faceplate', [FACEPLATE], fg='white', bg='blue')
# outlet pipe + pump
d.rect(680, 532, 150, 16, fill='track')
d.rect(680, 535, 150, 10, fill='teal', actions=[conn('rectangle.visible', S + 'PUMP1.RUNNING')])
d.ellipse(830, 495, 90, 90, fill='off', stroke='line', sw=2, actions=[
conn('ellipse.fillPaint', S + 'PUMP1.RUNNING', transform=tr_threshold([(False, 'off'), (True, 'green')], 'Boolean'))])
d.text(830, 528, 90, 24, 'P1', 16, 'white', bold=True, align='Center')
d.rect(920, 532, 170, 16, fill='track')
d.rect(920, 535, 170, 10, fill='teal', actions=[conn('rectangle.visible', S + 'PUMP1.RUNNING')])
d.text(800, 600, 150, 18, 'PUMP 1', 11, 'muted', bold=True, align='Center')
for txt, col, val in (('AUTO', 'teal', 1), ('MANUAL', 'amber', 0)):
d.text(800, 620, 150, 20, txt, 13, col, bold=True, align='Center')
d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.visible', S + 'PUMP1.MODE', transform=tr_threshold(
[(0, val == 0), (1, val == 1)], 'Double', 'Boolean'))]) + '</text>')
# info column
x = 860
d.rect(x, 90, 230, 330, fill='panel', stroke='line', r=8)
kv(d, x + 16, 104, 200, 'VOLUME (TANK1.CALC)', VOLUME, '9999.9', 'm3')
kv(d, x + 16, 168, 200, 'FLOW PER SECOND (JFLOW)', S + 'TANK1.JFLOW.sPerMin', '999.99', 'm3/s')
kv(d, x + 16, 232, 200, 'LEVEL MAXIMUM', S + 'TANK1.LEVEL.MAX', '999.9', '%')
kv(d, x + 16, 296, 200, 'COUNTER (DEMO.INCR1)', S + 'DEMO.COUNTER', '999', '')
d.databar(x + 16, 352, 198, 10, S + 'DEMO.COUNTER', 0, 100, 'violet', 'track', 'Right')
d.text(x + 16, 376, 200, 16, 'PUMP RUN TIME', 10, 'muted')
d.number(x + 16, 392, 150, 24, S + 'PUMP1.RUNNING.RUN_SECONDS', '9999999', 16, align='Left')
d.text(x + 170, 396, 40, 18, 's', 11, 'muted')
# gauges
card(d, 1130, 10, 740, 330, 'Key figures')
gauge(d, 1255, 175, 95, LEVEL, 0, 100, '999.9', '%', 'Level', thresholds=LVL_COLORS, extra=[level_color()])
gauge(d, 1500, 175, 95, INFLOW, 0, 500, '9999', 'm3/h', 'Inflow', 'violet')
gauge(d, 1745, 175, 95, VOLUME, 0, 200, '999.9', 'm3', 'Volume', 'blue')
card(d, 1130, 350, 740, 320, 'Last 10 minutes', 'Micro trend: level (teal, 0-100 %) and inflow (violet, 0-500 m3/h)')
d.micro_trend(1150, 410, 700, 240, [(LEVEL, 0, 100, 'teal'), (INFLOW, 0, 500, 'violet')])
return d
def build_control():
d = Display('CIENG_Control', W, H, 'Process control', design_h=HD)
d.rect(0, 0, W, HD, fill='bg')
# setpoint -> Modbus loopback
card(d, 10, 10, 925, 325, 'Setpoint -> PLC1 (Modbus loopback)', 'Slider, spinner and input field write PLC1.SETPOINT; READBACK returns through Modbus')
d.slider(40, 70, 600, 64, S + 'PLC1.SETPOINT', 0, 100, 10, 5)
d.text(40, 150, 140, 16, 'SPINNER', 10, 'muted', bold=True)
d.spinner(40, 170, 140, 36, S + 'PLC1.SETPOINT', 0, 100, 5)
d.text(200, 150, 140, 16, 'INPUT FIELD', 10, 'muted', bold=True)
d.number_field(200, 170, 140, 36, S + 'PLC1.SETPOINT', '999', 16)
d.text(360, 150, 160, 16, 'SETPOINT', 10, 'muted', bold=True)
d.number(360, 168, 120, 40, S + 'PLC1.SETPOINT', '999', 28, 'blue', align='Left')
d.text(40, 226, 300, 16, 'READBACK (data bar + scale)', 10, 'muted', bold=True)
d.databar(40, 248, 600, 18, S + 'PLC1.READBACK', 0, 100, 'blue', 'track', 'Right')
d.rect_scale(40, 268, 600, 36, 0, 100, 10, 5, vertical=False)
gauge(d, 790, 175, 95, S + 'PLC1.READBACK', 0, 100, '999', '', 'Readback', 'blue')
d.lamp(700, 30, 12, S + 'PLC1.COMM_OK', off='red')
d.text(718, 26, 200, 18, 'station CIENG_PLC', 11, 'muted')
# digital command
card(d, 945, 10, 925, 325, 'Digital command -> PLC1.CMD', 'Toggle and push buttons write the coil; FEEDBACK is read back from the input bit')
d.toggle(975, 80, 200, 48, 'CMD (toggle)', S + 'PLC1.CMD', 14)
d.button(975, 150, 95, 40, 'Set ON', [act_set(S + 'PLC1.CMD', 1)], fg='white', bg='green')
d.button(1080, 150, 95, 40, 'Set OFF', [act_set(S + 'PLC1.CMD', 0)], fg='text', bg='card2')
d.ellipse(1300, 80, 120, 120, fill='off', stroke='line', sw=3, actions=[
conn('ellipse.fillPaint', S + 'PLC1.FEEDBACK', transform=tr_threshold([(False, 'off'), (True, 'green')], 'Boolean'))])
d.text(1300, 128, 120, 24, 'FEEDBACK', 13, 'white', bold=True, align='Center')
d.text(1460, 90, 380, 16, 'LAST CHANGE OF FEEDBACK', 10, 'muted', bold=True)
d.datetime_field(1460, 112, 300, 30, S + 'PLC1.FEEDBACK', 'ItemUpdTime', 13) # date/time field (editable on the web)
d.text(1460, 160, 380, 16, 'STATUS', 10, 'muted', bold=True)
d.text(1460, 180, 380, 24, 'NORMAL', 16, 'text', bold=True)
d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', S + 'PLC1.FEEDBACK', 'ItemStatusMnemonic')]) + '</text>')
# pump
card(d, 10, 345, 925, 325, 'Pump 1', 'Combo box, buttons and check box write PUMP1.MODE / PUMP1.RUNNING (mode changes are audited)')
d.text(40, 400, 160, 16, 'MODE (COMBO BOX)', 10, 'muted', bold=True)
d.combo(40, 420, 200, 34, S + 'PUMP1.MODE', '0;Manual;1;Auto', 14)
d.button(260, 420, 110, 34, 'Manual', [act_set(S + 'PUMP1.MODE', 0)], fg='text', bg='card2')
d.button(380, 420, 110, 34, 'Auto', [act_set(S + 'PUMP1.MODE', 1)], fg='white', bg='blue')
d.text(40, 478, 300, 16, 'RUN COMMAND (CHECK BOX, MANUAL MODE)', 10, 'muted', bold=True)
d.checkbox(40, 498, 240, 32, 'Pump running', S + 'PUMP1.RUNNING', 14)
d.text(40, 552, 300, 16, 'DESCRIPTION (TEXT FIELD)', 10, 'muted', bold=True)
d.text_field(40, 572, 450, 30, S + 'PUMP1.MODE', 'ItemDesc', 13)
d.ellipse(600, 420, 110, 110, fill='off', stroke='line', sw=3, actions=[
conn('ellipse.fillPaint', S + 'PUMP1.RUNNING', transform=tr_threshold([(False, 'off'), (True, 'green')], 'Boolean'))])
d.text(600, 462, 110, 24, 'P1', 18, 'white', bold=True, align='Center')
d.text(560, 548, 220, 16, 'RUN TIME (INTEGRATOR)', 10, 'muted', bold=True, align='Center')
d.number(560, 566, 190, 34, S + 'PUMP1.RUNNING.RUN_SECONDS', '9999999', 24, align='Right')
d.text(754, 576, 30, 18, 's', 12, 'muted')
# alarm test
card(d, 945, 345, 925, 325, 'Tank 1 - alarm test', 'Stop live data first, then drive TANK1.LEVEL across its limits (H 80 / HH 90 / L 20 / LL 10)')
d.slider(975, 410, 560, 64, LEVEL, 0, 100, 10, 5)
for i, (lab, v, col, fg) in enumerate((('Low-Low 5', 5, 'red', 'white'), ('Low 15', 15, 'amber', 'white'),
('Normal 50', 50, 'teal', 'white'), ('High 85', 85, 'amber', 'white'),
('High-High 95', 95, 'red', 'white'))):
d.button(975 + i * 114, 500, 106, 38, lab, [act_set(LEVEL, v)], fg=fg, bg=col)
d.text(975, 566, 200, 16, 'LEVEL', 10, 'muted', bold=True)
d.number(975, 584, 160, 50, LEVEL, '999.9', 38, align='Left', extra=[level_color()])
d.text(1180, 566, 300, 16, 'ITEM STATUS', 10, 'muted', bold=True)
d.text(1180, 590, 300, 34, 'NORMAL', 22, 'text', bold=True)
d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', LEVEL, 'ItemStatusMnemonic'),
conn('text.fillPaint', LEVEL, transform=tr_threshold(LVL_COLORS))]) + '</text>')
d.ring_gauge(1720, 520, 90, LEVEL, 0, 100, 'teal', 14, LVL_COLORS)
d.circ_scale(1720, 520, 120, 0, 100, 20, 5)
d.number(1660, 500, 120, 40, LEVEL, '999.9', 26, align='Center')
return d
def build_trends():
d = Display('CIENG_Trends', W, H, 'Trends', design_h=HD)
d.rect(0, 0, W, HD, fill='bg')
d.rect(10, 10, 1380, 660, fill='panel', stroke='line', r=10)
d.trend(20, 20, 1360, 640, [(LEVEL, 'teal', 0, 100, 'Tank 1 level (%)'),
(INFLOW, 'violet', 0, 500, 'Tank 1 inflow (m3/h)')], 10, 'Tank 1 - level and inflow',
web_spares=False) # user choice: hairline shows 2 values; the web main trend then draws no line
for i, (title, item, mn, mx, col, fmt, unit) in enumerate((
('Level', LEVEL, 0, 100, 'teal', '999.9', '%'), ('Inflow', INFLOW, 0, 500, 'violet', '9999.9', 'm3/h'),
('CPU load', S + 'SYSTEM.CPU_LOAD', 0, 100, 'blue', '999.9', '%'))):
t = 10 + i * 223
card(d, 1400, t, 470, 213, title)
d.number(1660, t + 8, 150, 30, item, fmt, 20, col, align='Right')
d.text(1814, t + 14, 50, 18, unit, 11, 'muted')
d.micro_trend(1420, t + 48, 430, 150, [(item, mn, mx, col)], history=(i < 2)) # CPU_LOAD has no history
return d
def build_alarms():
d = Display('CIENG_Alarms', W, H, 'Alarms', design_h=HD)
d.rect(0, 0, W, HD, fill='bg')
card(d, 10, 10, 1860, 390, 'Current alarms', 'All areas - acknowledge with the check box or right-click')
d.alarm_overview(20, 60, 1840, 330, size=13)
card(d, 10, 410, 1860, 260, 'Alarm history - Tank 1', 'Historical overview filtered on alarm selection area CIENG_TANK1')
d.alarm_overview(20, 460, 1840, 200, 'HistoricalAlarms', asa='CIENG_TANK1', size=13)
return d
def build_system():
d = Display('CIENG_System', W, H, 'System', design_h=HD)
d.rect(0, 0, W, HD, fill='bg')
card(d, 10, 10, 600, 320, 'Server health', 'Real values of this PC, written by the live-data feed')
th = [(0, 'teal'), (80, 'amber'), (90, 'red')]
gauge(d, 160, 180, 100, S + 'SYSTEM.CPU_LOAD', 0, 100, '999.9', '%', 'CPU load', thresholds=th)
gauge(d, 450, 180, 100, S + 'SYSTEM.DISK_C', 0, 100, '999.9', '%', 'Disk C: used', 'blue', thresholds=th)
card(d, 620, 10, 600, 320, 'Communication and processes')
rows = ((S + 'PLC1.COMM_OK', 'Modbus station CIENG_PLC', 'Boolean', None),
(S + 'UA.COMM_OK', 'OPC UA client station CIENG_UA', 'Boolean', None),
(S + 'UA.SRV_STATE', 'OPC UA server state (0 = running)', 'Double', [(0, 'green'), (0.5, 'red')]),
(S + 'SYSTEM.PING_LOCALHOST', 'localhost reachable', 'Double', [(0, 'red'), (0.5, 'green')]),
(S + 'SYSTEM.PROC_ALM', 'ALARM process (alm) running', 'Double', [(0, 'red'), (0.5, 'green')]))
for i, (item, lab, inp, tbl) in enumerate(rows):
y = 60 + i * 52
d.rect(640, y, 560, 44, fill='panel', r=6)
if inp == 'Boolean':
d.lamp(656, y + 13, 18, item, off='red')
else:
d.lamp(656, y + 13, 18, item, inp='Double', table=tbl)
d.text(688, y + 12, 340, 20, lab, 13, 'text')
d.text(1040, y + 12, 150, 20, 'NORMAL', 12, 'muted', align='Right')
d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', item, 'ItemStatusMnemonic')]) + '</text>')
card(d, 1230, 10, 640, 320, 'OPC UA loopback', 'TANK1.LEVEL read back through CI Server\'s own OPC UA server')
for i, (lab, item, col) in enumerate((('TANK1.LEVEL', LEVEL, 'teal'), ('UA.LEVEL_COPY', S + 'UA.LEVEL_COPY', 'blue'))):
x = 1260 + i * 300
d.text(x, 70, 260, 16, lab, 10, 'muted', bold=True)
d.number(x, 90, 200, 44, item, '999.9', 32, col, align='Left')
d.databar(x, 150, 260, 18, item, 0, 100, col, 'track', 'Right')
d.text(x, 182, 260, 16, 'LAST UPDATE', 10, 'muted', bold=True)
d.time_text(x, 202, 260, 28, item, 13)
d.rect_scale(1260, 250, 560, 34, 0, 100, 10, 5, vertical=False)
card(d, 10, 340, 1860, 330, 'Reports', 'Report component: select CIENG_TANK1 or CIENG_HTML, generate and view')
d.report(20, 390, 1840, 270)
return d
def build_banner():
d = Display('CIENG_AlarmBanner', 1920, 96, 'Alarm banner', bg='panel')
# Desktop: frames inside a <tab> ignore their zoom attribute; the layout command with a zoom argument
# applies it. Only ONE command can run at a time (more give "IllegalStateException: A command is
# already being executed"), so only the Overview tab is fitted here; the toolbar / menu / F-keys
# open the other tabs with fitDisplay. Web: the plain open action (web ignores ACTION commands).
d.rect(0, 0, 1920, 96, fill='panel', actions=[
act_open('CIENG_Overview', 'CIENG_Operator', 'ovw', event='On entry'),
act_cmd('ACTION navigate to ovw CIENG_Overview stretchDisplay', server=False, event='On entry')])
d.line(0, 0, 1920, 0, 'line', 1)
d.rect(10, 7, 170, 82, fill='card', stroke='line', r=8)
d.text(24, 13, 70, 18, 'ALARMS', 12, 'muted', bold=True)
d.ellipse(96, 14, 16, 16, fill='off', actions=[conn('ellipse.fillPaint', LEVEL, transform=tr_threshold(
[(0, 'red'), (10, 'amber'), (20, 'green'), (80, 'amber'), (90, 'red')]))])
d.text(118, 13, 60, 18, 'Tank 1', 12, 'text')
d.button(24, 44, 142, 34, 'Alarm list', [act_open('CIENG_Alarms', 'CIENG_Operator', 'alm')], fg='white', bg='blue', size=13)
# 4 rows of 20 px (14 px font, web) + border: no empty white area below the rows when 4+ alarms
d.alarm_overview(190, 7, 1722, 82, size=14, banner=True)
return d
def build_faceplate():
d = Display('CIENG_TankFaceplate', 420, 600, 'Tank 1 faceplate', bg='card')
d.rect(0, 0, 420, 600, fill='card')
d.rect(0, 0, 420, 52, fill='card2')
d.text(20, 14, 300, 24, 'TANK 1 | LEVEL', 15, 'text', bold=True)
d.button(370, 10, 36, 32, 'X', [act_close()], fg='text', bg='card', tip='Close')
d.text(20, 64, 380, 18, 'Tank 1 level (%)', 11, 'muted')
d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', LEVEL, 'ItemDesc')]) + '</text>')
d.number(20, 86, 200, 56, LEVEL, '999.9', 44, align='Left', extra=[level_color()])
d.text(224, 106, 30, 24, '%', 16, 'muted')
d.text(270, 92, 130, 16, 'STATUS', 10, 'muted', bold=True, align='Right')
d.text(250, 110, 150, 26, 'NORMAL', 16, 'text', bold=True, align='Right')
d.parts[-1] = d.parts[-1].replace('</text>', data([conn('text.value', LEVEL, 'ItemStatusMnemonic'),
conn('text.fillPaint', LEVEL, transform=tr_threshold(LVL_COLORS))]) + '</text>')
d.databar(40, 160, 60, 280, LEVEL, 0, 100, 'blue', 'track', 'Up')
d.rect_scale(104, 160, 44, 280, 0, 100, 20, 5)
d.text(190, 160, 210, 16, 'ALARM LIMITS', 10, 'muted', bold=True)
for i, (lab, attr, col) in enumerate((('High-High', 'ItemHHL', 'red'), ('High', 'ItemHL', 'amber'),
('Low', 'ItemLL', 'amber'), ('Low-Low', 'ItemLLL', 'red'))):
y = 186 + i * 40
d.rect(190, y, 210, 34, fill='panel', r=6)
d.rect(190, y, 6, 34, fill=col)
d.text(206, y + 8, 100, 18, lab, 12, 'text')
d.number(300, y + 4, 90, 26, LEVEL, '999.9', 16, col, attr=attr)
d.text(190, 352, 210, 16, 'MAXIMUM SEEN', 10, 'muted', bold=True)
d.number(190, 370, 140, 32, S + 'TANK1.LEVEL.MAX', '999.9', 22, align='Left')
d.text(190, 412, 210, 16, 'LAST UPDATE', 10, 'muted', bold=True)
d.time_text(190, 430, 210, 24, LEVEL, 11)
d.micro_trend(20, 460, 380, 80, [(LEVEL, 0, 100, 'teal')])
d.button(20, 552, 120, 34, 'Trends', [act_open('CIENG_Trends', 'CIENG_Operator', 'trd')], fg='text', bg='card2')
d.button(150, 552, 120, 34, 'Alarms', [act_open('CIENG_Alarms', 'CIENG_Operator', 'alm')], fg='text', bg='card2')
d.button(280, 552, 120, 34, 'Close', [act_close()], fg='white', bg='blue')
return d
if __name__ == '__main__':
out = sys.argv[1] if len(sys.argv) > 1 else os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')
for b in (build_header, build_overview, build_control, build_trends, build_alarms, build_system, build_banner,
build_faceplate):
disp = b()
disp.save(out)
print(disp.name, len(disp.parts), 'components')

View file

@ -0,0 +1,583 @@
"""Small XML writer for CI Server R1.03 display files (Edit Module format 1.3.0.0).
Positions are given as boxes (left, top, width, height) in display pixels; CI Server stores a
component as its centre (x, y) plus half sizes (top, bottom, left, right).
Element and property names follow the installed component definitions
(%TLS_WAP_PATH%\\cfg\\operatorInterfaces\\DEPLOY\\components\\*.xml) and factory displays.
"""
from xml.sax.saxutils import escape
# ---------------------------------------------------------------- theme (dark dashboard)
C = {
'bg': (13, 17, 23), 'panel': (22, 27, 34), 'card': (28, 35, 45), 'card2': (36, 45, 57),
'line': (48, 61, 77), 'text': (230, 237, 243), 'muted': (139, 152, 168), 'dim': (88, 100, 116),
'blue': (59, 130, 246), 'teal': (20, 184, 166), 'green': (34, 197, 94), 'amber': (245, 158, 11),
'red': (239, 68, 68), 'violet': (139, 92, 246), 'off': (71, 85, 105), 'white': (255, 255, 255),
'track': (40, 50, 64),
}
FONT_UI = 'Segoe UI'
FONT_NUM = 'Consolas'
def rgb(c):
c = C.get(c, c) if isinstance(c, str) else c
return 'r="%d" g="%d" b="%d"' % tuple(c)
def colorset(tag, c):
return '<%s type="colorSet" %s/>' % (tag, rgb(c))
def paint(tag, c):
return '<%s type="paint"><paint type="colorSet" %s/></%s>' % (tag, rgb(c), tag)
def font(size, bold=False, name=FONT_UI, tag='font'):
b = ' bold="true"' if bold else ''
return '<%s type="font" name="%s"%s size="%d" underline="false" strikethrough="false"/>' % (tag, name, b, size)
def esc(s):
return escape(str(s))
def box_attrs(l, t, w, h):
return 'x="%.1f" y="%.1f" top="%.1f" bottom="%.1f" left="%.1f" right="%.1f" rotation="0.0" shear="0.0"' % (
l + w / 2.0, t + h / 2.0, h / 2.0, h / 2.0, w / 2.0, w / 2.0)
def box_elems(l, t, w, h):
return ('<x>%.1f</x><y>%.1f</y><top>%.1f</top><bottom>%.1f</bottom><left>%.1f</left><right>%.1f</right>'
'<rotation>0.0</rotation><shear>0.0</shear>') % (l + w / 2.0, t + h / 2.0, h / 2.0, h / 2.0, w / 2.0, w / 2.0)
_FONTS = {}
def text_width(s, size, bold=False, name=FONT_UI):
"""Width in display pixels, measured with the Windows font (matches the HTML export within ~3 %)."""
try:
from PIL import ImageFont
fn = {(FONT_UI, False): 'segoeui.ttf', (FONT_UI, True): 'segoeuib.ttf',
(FONT_NUM, False): 'consola.ttf', (FONT_NUM, True): 'consolab.ttf'}[(name, bool(bold))]
key = (fn, size)
if key not in _FONTS:
_FONTS[key] = ImageFont.truetype(r'C:\Windows\Fonts\%s' % fn, size)
return _FONTS[key].getlength(s) * 0.975
except Exception:
return len(s) * size * 0.55
def fit(l, w, s, size, align, bold=False, name=FONT_UI):
"""Text and numbers are exported with keepOriginalSize: drawn at natural size, centred on the box.
Shrink the box to the measured text width so 'Left' / 'Right' alignment still lands right."""
est = min(w, max(4.0, text_width(s, size, bold, name)))
if align == 'Left':
return l, est
if align == 'Right':
return l + w - est, est
return l, w
# ---------------------------------------------------------------- data connections
def tr_linear(i0, i1, o0, o1):
return ('<transformation type="transformationLinear"><inputType>java.lang.Double</inputType>'
'<outputType>java.lang.Double</outputType><inputValueStart>%s</inputValueStart>'
'<inputValueEnd>%s</inputValueEnd><outputValueStart>%s</outputValueStart>'
'<outputValueEnd>%s</outputValueEnd></transformation>') % (float(i0), float(i1), float(o0), float(o1))
def tr_threshold(table, inp='Double', out='Paint'):
"""table: list of (input, output). Output for Paint = colour key/tuple, Boolean = bool."""
itype = {'Double': 'java.lang.Double', 'Boolean': 'java.lang.Boolean'}[inp]
otype = {'Paint': 'fasttools.jwui.common.property.paint.PaintSet', 'Boolean': 'java.lang.Boolean',
'Color': 'fasttools.jtools.common.property.color.ColorSet'}[out]
rows = []
for i, o in table:
iv = ('true' if i else 'false') if inp == 'Boolean' else repr(float(i))
if out == 'Paint':
ov = '<thresholdOut type="paint"><paint type="colorSet" %s/></thresholdOut>' % rgb(o)
elif out == 'Color':
ov = '<thresholdOut type="colorSet" %s/>' % rgb(o)
else:
ov = '<thresholdOut>%s</thresholdOut>' % ('true' if o else 'false')
rows.append('<thresholdIn>%s</thresholdIn>%s' % (iv, ov))
return ('<transformation type="transformationThreshold"><inputType>%s</inputType><outputType>%s</outputType>'
'<thresholdTable type="thresholdTable">%s</thresholdTable></transformation>') % (itype, otype, ''.join(rows))
def conn(prop, item, attr='ItemValue', direction=1, transform=''):
"""Connect component property <prop> (e.g. 'number.value') to an item attribute.
direction 1 = read, 2 = write, None = read and write (as the factory toggle buttons)."""
d = '' if direction is None else '<direction>%d</direction>' % direction
return ('<action type="actionConnectTo"><property type="property" name="%s"/>'
'<filter type="filter"><value>0.0</value></filter>%s<connection type="connection">%s'
'<itemName>%s</itemName><itemAttribute>%s</itemAttribute></connection></action>') % (
prop, transform, d, esc(item), attr)
def act_set(item, value):
return ('<action type="actionSetItemAttribute"><event type="event" event="On action"/>'
'<filter type="filter"><value>%s</value></filter><connection type="connection"><direction>2</direction>'
'<location type="nodeName" node="$default$"/><itemName>%s</itemName><itemAttribute>ItemValue</itemAttribute>'
'</connection></action>') % (float(value), esc(item))
def act_open(display, layout=None, frame=None, event='On action'):
lay = ''
if layout or frame:
lay = ('<type type="displayActivationType" value="ActivateSpecific"/><display>%s</display>'
'<layout>%s</layout><layoutFrame>%s</layoutFrame>') % (display, layout or '', frame or '')
return '<action type="actionActivateDisplay"><event type="event" event="%s"/>%s</action>' % (event, lay)
return ('<action type="actionActivateDisplay"><event type="event" event="%s"/><display>%s</display>'
'</action>') % (event, display)
def act_close(event='On action'):
return '<action type="actionExitDisplay"><event type="event" event="%s"/></action>' % event
def act_cmd(command, server=True, event='On action'):
return ('<action type="actionExecuteCommand"><event type="event" event="%s"/><command>%s</command>'
'<onServer>%s</onServer></action>') % (event, esc(command), 'true' if server else 'false')
def data(actions):
return '<data type="data">%s</data>' % ''.join(actions) if actions else ''
# ---------------------------------------------------------------- display builder
class Display:
def __init__(self, name, width, height, title, bg='bg', design_h=None):
self.name, self.w, self.h, self.title, self.bg = name, width, height, title, bg
# Coordinates are written for a display design_h high and stretched vertically to height:
# panels, bars and lists grow, text / controls / round shapes keep their size and only move.
self.sy = float(height) / design_h if design_h else 1.0
self.parts = []
self.hid = 6 # 1 = layer, 2..6 = visibility groups
def _b(self, l, t, w, h, stretch):
if self.sy == 1.0:
return l, t, w, h
if stretch:
return l, t * self.sy, w, h * self.sy
return l, (t + h / 2.0) * self.sy - h / 2.0, w, h
def _id(self):
self.hid += 1
return '<htmlId>%d</htmlId>' % self.hid
def add(self, s):
self.parts.append(s)
# ----- shapes
def rect(self, l, t, w, h, fill='card', stroke=None, sw=1.0, r=0, actions=(), tip=None, fill_amount=None,
fill_dir=None, visible=True):
l, t, w, h = self._b(l, t, w, h, h > 40)
s = '<rectangle type="componentData">' + self._id()
if tip:
s += '<toolTipText>%s</toolTipText>' % esc(tip)
if r:
# stored as a fraction (0..1) of the half width / half height (web client
# ExtendedRectangle: rx = width / 2 * roundingX); pixel values > 1 draw an ellipse
s += '<roundingX>%.4f</roundingX><roundingY>%.4f</roundingY>' % (min(1.0, 2.0 * r / w), min(1.0, 2.0 * r / h))
s += box_elems(l, t, w, h)
s += '<stroke type="stroke" width="%.1f"/>' % sw
if stroke:
s += '<strokeOn>true</strokeOn>' + paint('strokePaint', stroke)
else:
s += '<strokeOn>false</strokeOn>'
if fill:
s += '<fillOn>true</fillOn>' + paint('fillPaint', fill)
else:
s += '<fillOn>false</fillOn>'
if fill_amount is not None:
s += '<fillAmount>%s</fillAmount>' % fill_amount
if fill_dir:
s += '<fillDirection type="fillDirection" value="%s"/>' % fill_dir
if not visible:
s += '<visible>false</visible>'
s += data(actions) + '</rectangle>'
self.add(s)
def ellipse(self, l, t, w, h, fill='green', stroke=None, sw=1.0, actions=(), tip=None):
l, t, w, h = self._b(l, t, w, h, False)
s = '<ellipse type="componentData">' + self._id()
if tip:
s += '<toolTipText>%s</toolTipText>' % esc(tip)
s += box_elems(l, t, w, h) + '<stroke type="stroke" width="%.1f"/>' % sw
s += ('<strokeOn>true</strokeOn>' + paint('strokePaint', stroke)) if stroke else '<strokeOn>false</strokeOn>'
s += ('<fillOn>true</fillOn>' + paint('fillPaint', fill)) if fill else '<fillOn>false</fillOn>'
s += data(actions) + '</ellipse>'
self.add(s)
def arc(self, cx, cy, rad, start, extent, color='blue', sw=10.0, actions=()):
cy = cy * self.sy
s = '<arc type="componentData">' + self._id()
s += '<startAngle>%.1f</startAngle><extentAngle>%.1f</extentAngle><closed>false</closed>' % (start, extent)
s += box_elems(cx - rad, cy - rad, 2 * rad, 2 * rad)
s += '<stroke type="stroke" width="%.1f" endCap="butt"/><strokeOn>true</strokeOn>' % sw
s += paint('strokePaint', color) + '<fillOn>false</fillOn>'
s += data(actions) + '</arc>'
self.add(s)
def line(self, x1, y1, x2, y2, color='line', sw=2.0, actions=()):
# a line is stored by its bounding box; direction by the sign of the extents is not available,
# so only horizontal / vertical lines are used here
l, t = min(x1, x2), min(y1, y2)
w, h = abs(x2 - x1), abs(y2 - y1)
# drawn as a thin filled rectangle: a <line> without curve points is placed wrongly on the web
if h < w:
self.rect(l, t - sw / 2.0, max(w, 1), sw, fill=color, actions=actions)
else:
self.rect(l - sw / 2.0, t, sw, max(h, 1), fill=color, actions=actions)
# ----- text and numbers
def text(self, l, t, w, h, value, size=12, color='text', bold=False, align='Left', actions=(), name=FONT_UI,
bgfill=None):
l, t, w, h = self._b(l, t, w, h, False)
s = '<text type="componentData">' + self._id() + '<value>%s</value>' % esc(value)
s += font(size, bold, name) + paint('fillPaint', color)
l, w = fit(l, w, str(value), size, align, bold, name)
s += '<justification type="textJustification" value="TextJustificationCenter"/>'
if bgfill:
s += '<backgroundOn>true</backgroundOn>' + paint('backgroundPaint', bgfill)
s += '<stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize>'
s += box_elems(l, t, w, h) + data(actions) + '</text>'
self.add(s)
def number(self, l, t, w, h, item, fmt='999.9', size=22, color='text', bold=True, align='Right', attr='ItemValue',
extra=()):
l, t, w, h = self._b(l, t, w, h, False)
s = '<number type="componentData">' + self._id() + '<value>0.0</value><format>%s</format>' % fmt
s += font(size, bold, FONT_NUM) + paint('fillPaint', color)
l, w = fit(l, w, fmt.replace('9', '0'), size, align, bold, FONT_NUM)
s += '<justification type="textJustification" value="TextJustificationCenter"/>'
s += '<stroke type="stroke" width="1.0"/><keepOriginalSize>true</keepOriginalSize>'
s += box_elems(l, t, w, h) + data([conn('number.value', item, attr)] + list(extra)) + '</number>'
self.add(s)
def number_field(self, l, t, w, h, item, fmt='9999', size=14, editable=True, attr='ItemValue', as_datetime=False):
l, t, w, h = self._b(l, t, w, h, False)
s = '<numberField type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += font(size, True, FONT_NUM) + '<format>%s</format>' % fmt
s += '<editable>%s</editable>' % ('true' if editable else 'false')
if as_datetime:
s += '<asDateTime>true</asDateTime>'
s += colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card2')
s += '<justification type="jTextJustification" value="TextJustificationRight"/>'
s += data([conn('numberField.value', item, attr, direction=None if editable else 1)]) + '</numberField>'
self.add(s)
def text_field(self, l, t, w, h, item, attr='ItemDescription', size=12):
l, t, w, h = self._b(l, t, w, h, False)
s = '<textField type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += font(size) + '<editable>false</editable>'
s += colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card2')
s += data([conn('textField.value', item, attr)]) + '</textField>'
self.add(s)
def time_text(self, l, t, w, h, item, size=12, color='text', align='Left'):
"""Last update time of an item: number field with asDateTime (epoch seconds -> local date and time).\n The web dateTimeField only shows a value when editable (white input boxes)."""
self.number_field(l, t, w, h, item, '', size, editable=False, attr='ItemUpdTime', as_datetime=True)
def datetime_field(self, l, t, w, h, item, attr='ItemUpdTime', size=12, editable=True):
l, t, w, h = self._b(l, t, w, h, False)
s = '<dateTimeField type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += font(size) + colorset('foregroundColor', 'text')
s += '<editable>%s</editable><secondsVisible>true</secondsVisible>' % ('true' if editable else 'false')
s += colorset('backgroundColor', 'card2')
s += data([conn('dateTimeField.value', item, attr)]) + '</dateTimeField>'
self.add(s)
# ----- controls
def button(self, l, t, w, h, label, actions, fg='text', bg='card2', size=12, bold=True, tip=None, extra=()):
l, t, w, h = self._b(l, t, w, h, False)
s = '<button type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
if tip:
s += '<toolTipText>%s</toolTipText>' % esc(tip)
s += '<label>%s</label>' % esc(label) + font(size, bold)
s += colorset('foregroundColor', fg) + colorset('backgroundColor', bg)
s += data(list(actions) + list(extra)) + '</button>'
self.add(s)
def toggle(self, l, t, w, h, label, item, size=12):
l, t, w, h = self._b(l, t, w, h, False)
s = '<toggleButton type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<label>%s</label>' % esc(label) + font(size, True)
s += colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card2')
s += data([conn('toggleButton.value', item, direction=None)]) + '</toggleButton>'
self.add(s)
def checkbox(self, l, t, w, h, label, item, size=12):
l, t, w, h = self._b(l, t, w, h, False)
s = '<checkBox type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<label>%s</label>' % esc(label) + font(size)
s += '<opaque>false</opaque>' + colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card')
s += data([conn('checkBox.value', item, direction=None)]) + '</checkBox>'
self.add(s)
def slider(self, l, t, w, h, item, mn, mx, major, minor=None, size=10):
l, t, w, h = self._b(l, t, w, h, False)
s = '<slider type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<maximum>%s</maximum><minimum>%s</minimum><value>%s</value>' % (float(mx), float(mn), float(mn))
s += '<majorTickSpacing>%s</majorTickSpacing><minorTickSpacing>%s</minorTickSpacing>' % (
float(major), float(minor or major))
s += '<paintLabels>true</paintLabels><paintTicks>true</paintTicks><trackDrag>false</trackDrag>'
s += font(size) + '<opaque>false</opaque>' + colorset('foregroundColor', 'muted')
s += data([conn('slider.value', item, direction=None)]) + '</slider>'
self.add(s)
def spinner(self, l, t, w, h, item, mn, mx, step=1, size=14):
l, t, w, h = self._b(l, t, w, h, False)
s = '<spinner type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<editable>true</editable><step>%s</step><minimum>%s</minimum><maximum>%s</maximum>' % (
float(step), float(mn), float(mx))
s += font(size, True, FONT_NUM) + colorset('foregroundColor', 'text') + colorset('backgroundColor', 'card2')
s += '<zoomEnabled>false</zoomEnabled>'
s += data([conn('spinner.value', item, direction=None)]) + '</spinner>'
self.add(s)
def combo(self, l, t, w, h, item, options, size=12):
l, t, w, h = self._b(l, t, w, h, False)
"""options: 'value;Text;value;Text' (web client format)."""
s = '<comboBox type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<label>%s</label>' % esc(options) + font(size) + colorset('foregroundColor', 'text')
s += data([conn('comboBox.value', item, direction=None)]) + '</comboBox>'
self.add(s)
# ----- indicators
def databar(self, l, t, w, h, item, lo=0, hi=100, fg='blue', bg='track', direction='Up', border=None):
l, t, w, h = self._b(l, t, w, h, h > w)
s = '<dataBar type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<fillOn>true</fillOn>' + paint('background', bg) + paint('foreground', fg)
s += paint('borderColor', border or bg) + paint('foregroundBorderColor', fg)
s += '<lowLimit>%s</lowLimit><highLimit>%s</highLimit>' % (float(lo), float(hi))
s += '<growthDirection type="growthDirection" value="GrowthDirection%s"/>' % direction
s += data([conn('dataBar.value', item)]) + '</dataBar>'
self.add(s)
def rect_scale(self, l, t, w, h, mn, mx, major, minor, vertical=True, fmt='999', size=10):
l, t, w, h = self._b(l, t, w, h, h > w)
s = '<rectangularScale type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<maximum>%s</maximum><minimum>%s</minimum><majorTickSpacing>%s</majorTickSpacing>' % (
float(mx), float(mn), float(major))
s += '<minorTickSpacing>%s</minorTickSpacing><format>%s</format><vertical>%s</vertical>' % (
float(minor), fmt, 'true' if vertical else 'false')
s += colorset('color', 'muted') + font(size) + '</rectangularScale>'
self.add(s)
def circ_scale(self, cx, cy, rad, mn, mx, major, minor, start=225, extent=-270, fmt='999', size=9):
cy = cy * self.sy
s = '<circularScale type="componentData" %s>' % box_attrs(cx - rad, cy - rad, 2 * rad, 2 * rad) + self._id()
s += '<maximum>%s</maximum><minimum>%s</minimum><majorTickSpacing>%s</majorTickSpacing>' % (
float(mx), float(mn), float(major))
s += '<minorTickSpacing>%s</minorTickSpacing><format>%s</format>' % (float(minor), fmt)
s += '<startAngle>%s</startAngle><extentAngle>%s</extentAngle>' % (float(start), float(extent))
s += colorset('color', 'muted') + font(size) + '</circularScale>'
self.add(s)
def ring_gauge(self, cx, cy, rad, item, mn, mx, color='teal', sw=12.0, thresholds=None):
"""270 degree ring with the gap on the right; the value arc grows from 9 o'clock up and down.
The Operator Interface (desktop) draws arc angles mirrored about the horizontal axis compared
with the web client, so only shapes symmetric about that axis look the same on both:
track 45..315 degrees, value arc centred on 180 degrees (start = 180 - extent / 2)."""
self.arc(cx, cy, rad, 45, 270, 'track', sw)
acts = [conn('arc.extentAngle', item, transform=tr_linear(mn, mx, 0.5, 270)),
conn('arc.startAngle', item, transform=tr_linear(mn, mx, 179.75, 45))]
if thresholds:
acts.append(conn('arc.strokePaint', item, transform=tr_threshold(thresholds)))
self.arc(cx, cy, rad, 179.75, 0.5, color, sw, acts)
def lamp(self, l, t, d, item, on='green', off='off', inp='Boolean', table=None):
tbl = table or [(False, off), (True, on)]
self.ellipse(l, t, d, d, fill=off, actions=[conn('ellipse.fillPaint', item,
transform=tr_threshold(tbl, inp))])
# ----- complex components
def alarm_overview(self, l, t, w, h, overview='CurrentAlarms', asa=None, size=12, banner=False):
l, t, w, h = self._b(l, t, w, h, True)
s = '<alarmOverview type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<zoomEnabled>false</zoomEnabled>'
s += '<overviewType type="alarmOverview" value="%s"/>' % overview
# dark rows: background, unacknowledged / acknowledged row colour per priority, text colours
s += '<opaque>true</opaque>' + colorset('backgroundColor', 'panel')
for c, col in (('Alarm', (248, 113, 113)), ('Normal', 'text'), ('Ackn', 'muted'), ('Info', 'muted'),
('Diag', 'amber'), ('Deactive', 'muted'), ('Recover', 'green')):
s += colorset('eventType%sAckColor' % c, col) + colorset('eventType%sNackColor' % c, col)
for p in range(0, 16):
s += ('<property type="componentProperty"><name>priorityNackColor[%02d]</name><value type="colorSet" %s/></property>'
'<property type="componentProperty"><name>priorityAckColor[%02d]</name><value type="colorSet" %s/></property>'
) % (p, rgb((64, 24, 30) if p <= 3 else (36, 45, 57)), p, rgb('card'))
s += font(size) + font(size, False, FONT_UI, 'alarmLineFont') + font(size - 1, True, FONT_UI, 'buttonFont')
# explicit columns: order and widths spread over the whole component width (autoFit off)
cols = [('AlarmTime', 200), ('Priority', 70), ('Section', 300), ('Tag', 170), ('ItemDesciption', 320),
('Text', 300), ('AlarmType', 120), ('Value', 110), ('Acknowledged', 110)]
scale = (w - 24.0) / sum(c[1] for c in cols)
for i, (c, cw) in enumerate(cols):
s += '<column%sVisible>true</column%sVisible><column%sPosition>%d</column%sPosition>' % (c, c, c, i + 1, c)
s += '<column%sWidth>%d</column%sWidth>' % (c, int(cw * scale), c)
hide = ['CEventActor', 'CEventCat', 'CEventCondition', 'CEventSource', 'CEventSubCond', 'EventActor',
'EventCat', 'EventCondition', 'EventSource', 'EventSubCond', 'Installation', 'ItemName',
'OriginalTime', 'Quality', 'Unit', 'User', 'Sub', 'EngUnits', 'Location', 'InstallationDescription',
'UnitDescription', 'SectionDescription', 'AlarmCollection', 'EventID', 'ConditionID', 'BranchID',
'PriorityText'] # AlarmAttribute is an array property
for c in hide:
s += '<column%sVisible>false</column%sVisible>' % (c, c)
if banner:
s += ('<statusLineVisible>false</statusLineVisible><autoFit>false</autoFit><stopMoreVisible>false'
'</stopMoreVisible><headingVisible>false</headingVisible><dateTimeSelectorVisible>false'
'</dateTimeSelectorVisible><filterSelectorVisible>false</filterSelectorVisible>')
else:
# autoFit in a tab that is hidden while loading squeezes all columns to nothing (web)
s += '<autoFit>false</autoFit>'
s += '<highAlarmPriorityRange>1-1</highAlarmPriorityRange><mediumAlarmPriorityRange>2-2</mediumAlarmPriorityRange>'
s += '<lowAlarmPriorityRange>3-3</lowAlarmPriorityRange><diagnosticAlarmPriorityRange>0-0,4-15</diagnosticAlarmPriorityRange>'
if asa:
s += ('<userDataFilterType type="alarmUserFilter" value="UserDataFilterASA"/>'
'<userDataFilterValue>%s</userDataFilterValue>'
'<dataFilterType type="alarmDataFilter" value="DataFilterUserFiler"/>') % asa
s += '<data type="data"><action type="actionInternalServiced"/></data></alarmOverview>'
self.add(s)
def report(self, l, t, w, h, report=None):
l, t, w, h = self._b(l, t, w, h, True)
s = '<reporting type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
if report:
s += '<reportSelected>%s</reportSelected>' % esc(report)
s += '<data type="data"><action type="actionInternalServiced"/></data></reporting>'
self.add(s)
def micro_trend(self, l, t, w, h, pens, time_range=600, history=True):
l, t, w, h = self._b(l, t, w, h, True)
"""pens: list of (item, min, max, colour)."""
s = '<microTrend type="componentData" %s>' % box_attrs(l, t, w, h) + self._id()
s += '<numberOfPens>%d</numberOfPens><realTime>true</realTime><fillWithHistory>%s</fillWithHistory>' % (len(pens), 'true' if history else 'false')
s += '<microTrendBackgroundFillOn>true</microTrendBackgroundFillOn><lowHighFillOn>false</lowHighFillOn>'
s += colorset('microTrendBackgroundFillColor', 'panel') + colorset('microTrendBackgroundColor', 'line')
acts = ['<action type="actionInternalServiced"/>']
for i, (item, mn, mx, col) in enumerate(pens):
s += ('<property type="componentProperty"><name>itemName[%d]</name><value/></property>'
'<property type="componentProperty"><name>scaleMin[%d]</name><value>%s</value></property>'
'<property type="componentProperty"><name>scaleMax[%d]</name><value>%s</value></property>'
'<property type="componentProperty"><name>color[%d]</name><value type="colorSet" %s/></property>'
'<property type="componentProperty"><name>stroke[%d]</name><value type="stroke" width="2.0"/></property>'
) % (i, i, float(mn), i, float(mx), i, rgb(col), i)
acts.append(conn('microTrend.itemName[%d]' % i, item, 'ItemName'))
s += data(acts) + '</microTrend>'
self.add(s)
def trend(self, l, t, w, h, pens, minutes=10, title='', web_spares=True):
l, t, w, h = self._b(l, t, w, h, True)
"""pens: list of (item, colour, min, max, description). Padded to 50 visible pens (ISS-041)."""
def pen(item, col, mn, mx, desc, spare=0):
if spare:
col_x = colorset('color', 'panel')
stroke, legend, vis_leg, rng, mn_s, mx_s, typ = '0.0', ' ' * spare, 'false', 1, '1.0E30', '2.0E30', 1
desc = ''
else:
col_x = colorset('color', col)
stroke, legend, vis_leg, rng, mn_s, mx_s, typ = '2.0', '', 'true', 1, repr(float(mn)), repr(float(mx)), 0
return ('<pen type="pen"><type>%d</type>%s<stroke type="stroke" width="%s"/><paint>@NULL</paint>'
'<visible>true</visible><visibleLegend>%s</visibleLegend>'
'<source type="sourceID" uri="ci:/item/%s"/><axisVisible>%s</axisVisible><axisPosition>0</axisPosition>'
'<labelVisible>true</labelVisible><majorTickVisible>true</majorTickVisible><minorTickVisible>true</minorTickVisible>'
'<axisColor>@NULL</axisColor><labelColor>@NULL</labelColor><scaleRangeType>%d</scaleRangeType>'
'<minimum>%s</minimum><maximum>%s</maximum><procentual>false</procentual><title/>'
'<description>%s</description><legendText>%s</legendText><titlePlacement>0</titlePlacement>'
'<titleRotation>0</titleRotation><labelRotation>0</labelRotation><majorGridVisible>false</majorGridVisible>'
'<minorGridVisible>false</minorGridVisible><lowHighLimitGridVisible>false</lowHighLimitGridVisible>'
'<lowHighLimitGridAreaVisible>false</lowHighLimitGridAreaVisible>'
'<lowLowHighHighLimitGridVisible>false</lowLowHighHighLimitGridVisible><majorGridColor>@NULL</majorGridColor>'
'<minorGridColor>@NULL</minorGridColor><lowHighLimitGridColor>@NULL</lowHighLimitGridColor>'
'<lowHighLimitGridAreaColor>@NULL</lowHighLimitGridAreaColor>'
'<lowLowHighHighLimiGridColor>@NULL</lowLowHighHighLimiGridColor>'
'<majorGridStroke type="stroke" width="0.1"/><minorGridStroke type="stroke" width="0.1"/>'
'<lowHighLimitGridStroke type="stroke" width="0.1"/><lowLowHighHighLimiGridStroke type="stroke" width="0.1"/>'
'<annotationVisible>false</annotationVisible><timeShift>0</timeShift></pen>') % (
typ, col_x, stroke, vis_leg, esc(item), 'true' if (not spare and pens and item == pens[0][0]) else 'false',
rng, mn_s, mx_s, esc(desc), legend)
body = ''.join(pen(*p) for p in pens)
if web_spares: # the web trend draws only with 50 visible pens (ISS-041); the desktop hairline then lists 50 values
body += ''.join(pen(pens[0][0], None, 0, 0, '', i) for i in range(1, 51 - len(pens)))
s = ('<chart type="componentData">' + self._id() +
'<config type="graphicInfo"><version type="version" value="1.3.0.0"/>'
'<backgroundBorder type="border" value="BorderEmpty"/><penPanelVisible>false</penPanelVisible>'
'<penPanelHeight>-1</penPanelHeight><toolbarVisible>true</toolbarVisible>'
'<toolbarPosition type="borderLayoutPosition" value="PositionNorth"/><shiftOffset>0</shiftOffset>'
'<shiftLength>0</shiftLength><enterpriseGroupLocation type="nodeName" node="$display$"/>'
'<chartPanel><name/><author/><version type="version" value="1.3.0.0"/><description/>'
'<forAllUsers>false</forAllUsers><template>false</template><group>@NULL</group><XyMode>false</XyMode>'
'<x>0</x><y>0</y><width>%d</width><heigth>%d</heigth><iconized>false</iconized>'
'<backgroundBorder type="border" value="BorderEmpty"/>%s'
'<backgroundPaint type="paint"><paint type="colorSet" %s/></backgroundPaint>'
'<plotAreaBorder type="border" value="BorderEmpty"/><plotAreaTransparent>false</plotAreaTransparent>'
'<plotAreaIcon>@NULL</plotAreaIcon><plotAreaPaint type="paint"><paint type="colorSet" %s/></plotAreaPaint>'
'%s<hairlineVisible>false</hairlineVisible><antialiasingText>true</antialiasingText>'
'<antialiasingData>true</antialiasingData><renderMode type="chartRendering" value="Rendering2d"/>'
'<timeNavigatorVisible>true</timeNavigatorVisible><timeRangeControlVisible>true</timeRangeControlVisible>'
'<autoUpdateInterval>false</autoUpdateInterval><legendVisible>true</legendVisible><legendTitle/>'
'<legendHeading/>%s%s%s<legendTransparancy>0.0</legendTransparancy>'
'<legendBorderType type="border" value="BorderEmpty"/><legendPositionType type="position" value="PositionNorthEast"/>'
'<timeSliderVisible>true</timeSliderVisible><timeSliderAbove>false</timeSliderAbove>'
'<valueSliderVisible>false</valueSliderVisible><valueSliderLeft>false</valueSliderLeft>'
'<xAxisReversed>false</xAxisReversed><yAxisReversed>false</yAxisReversed><projectorReversed>false</projectorReversed>'
'<scalingFonts>false</scalingFonts><maximumPens>50</maximumPens><pensPerPack>0</pensPerPack>'
'<triggerPen>0</triggerPen><timeAxisVisible>true</timeAxisVisible><timeAxisMajorTickVisible>true</timeAxisMajorTickVisible>'
'<timeAxisMinorTickVisible>false</timeAxisMinorTickVisible>%s%s%s'
'<timeAxisLabelVisible>true</timeAxisLabelVisible><timeAxisLongLabelVisible>false</timeAxisLongLabelVisible>'
'<timeAxisLabelRotation>0</timeAxisLabelRotation><timeAxisTitle/><timeAxisTitleRotation>0</timeAxisTitleRotation>'
'<timeAxisTitlePlacement>50</timeAxisTitlePlacement><timeAxisMajorGridVisible>true</timeAxisMajorGridVisible>'
'%s<timeAxisMajorGridStroke type="stroke" width="1.0" endCap="butt" lineJoin="bevel"/>'
'<timeAxisMinorGridVisible>false</timeAxisMinorGridVisible>%s'
'<timeAxisMinorGridStroke type="stroke" width="1.0" endCap="butt" lineJoin="bevel"/>'
'<headerText>%s</headerText>%s%s<headerJustification type="jTextJustification" value="TextJustificationLeft"/>'
'<footerText/>%s%s<footerJustification type="jTextJustification" value="TextJustificationLeft"/>'
'<enterprisePrimarySourceLocation type="nodeName" node="$default$"/>'
'<enterpriseSecondarySourceLocation type="nodeName" node="$default$"/>'
'<enterprisePrimaryHistoryLocation type="nodeName" node="$default$"/>'
'<enterpriseSecondaryHistoryLocation type="nodeName" node="$default$"/>'
'<updateFromHistory>true</updateFromHistory><useSampleInterval>true</useSampleInterval>'
'<sampleInterval>0</sampleInterval><optimised>true</optimised>%s'
'<timeRange type="timeRangeLast" count="%d"><type type="timeUnit" value="TimeUnitMinute"/></timeRange>'
'<updateInterval>5</updateInterval><fillHistory>true</fillHistory><updating>true</updating>'
'</chartPanel></config>%s<data type="data"><action type="actionInternalServiced"/></data></chart>') % (
w, h, colorset('foregroundColor', 'muted'), rgb('panel'), rgb('panel'), colorset('hairlineColor', 'muted'),
colorset('legendColor', 'text'), colorset('legendBackgroundColor', 'panel'), font(11, False, FONT_UI, 'legendFont'),
colorset('timeAxisColor', 'muted'), font(11, False, FONT_UI, 'timeAxisFont'), colorset('timeAxisLabelColor', 'muted'),
colorset('timeAxisMajorGridColor', 'line'), colorset('timeAxisMinorGridColor', 'line'),
esc(title), colorset('headerColor', 'text'), font(12, True, FONT_UI, 'headerFont'),
colorset('footerColor', 'muted'), font(11, False, FONT_UI, 'footerFont'), body, minutes, box_elems(l, t, w, h))
self.add(s)
# ----- output
def xml(self):
vg = ''
for i, (n, d, z) in enumerate([('Overview', 'Always shown', 10.0), ('Rough', 'Shown when viewing viewing a large area', 25.0),
('Standard', 'Shown when using the default view setting', 100.0),
('Detail', 'Shown only when viewing a small area', 400.0),
('Intricacies', 'Shown only when viewing a very small area', 1000.0)]):
vg += ('<visibilityGroup type="componentData"><htmlId>%d</htmlId><name>%s</name><description>%s</description>'
'<minimumZoomEnabled>true</minimumZoomEnabled><minimumZoomFactor>%s</minimumZoomFactor>'
'</visibilityGroup>\n') % (i + 2, n, d, z)
head = ('<?xml version="1.0" encoding="utf-8" ?>\n<visualization protocolVersion="1.3.0.0">\n <globalSection/>\n'
' <coreObjectDefinition type="displayDefinition">\n<version type="version" value="1.3.0.0"/>\n'
'<title>%s</title>\n<html>true</html>\n<width>%d</width>\n<height>%d</height>\n'
'<referenceCheck>%d</referenceCheck>\n'
'%s\n<backgroundColorOn>true</backgroundColorOn>\n%s\n%s\n%s\n<defaultStroke type="stroke" width="1.0"/>\n'
'<grid type="grid" gridVisible="true" snappingActive="true" verticalSnapInterval="4" horizontalSnapInterval="4" onTop="false">'
'<color type="colorSet" r="51" g="59" b="71"/></grid>\n'
'<revisionHistory type="revisionHistory"><revision type="revision" who="ADMIN" when="2026.10.02 12:00:00.000 AEST" '
'what="Generated by displays/generator/build.py" where="localhost"/></revisionHistory>\n'
'<blinkDelay>500</blinkDelay>\n<blinkEnabled>true</blinkEnabled>\n<mousePassThrough>false</mousePassThrough>\n'
) % (esc(self.title), self.w, self.h, self.hid, colorset('backgroundColor', self.bg),
colorset('defaultBgColor', self.bg), colorset('defaultFgColor', 'text'), font(12, False, FONT_UI, 'defaultFont'))
layer = '<visualizationLayer type="componentData"><htmlId>1</htmlId><name>Layer1</name></visualizationLayer>\n'
body = '<componentCountHint>%d</componentCountHint>\n' % len(self.parts)
# full-size background rectangle first (the web client ignores the display background colour on some frames)
return (head + vg + layer + body + '\n'.join(self.parts) +
'\n </coreObjectDefinition>\n</visualization>\n')
def save(self, folder):
import os
with open(os.path.join(folder, self.name + '.xml'), 'w', encoding='utf-8', newline='\r\n') as f:
f.write(self.xml())

View file

@ -1,11 +1,9 @@
@echo off
rem Remove the CI-Eng-Sample displays (operator interface and HTML version). CI Server R1.03.00.
rem Close CIENG_Tank, CIENG_Menu and CIENG_TrendLab in the Edit Module first.
rem Close them in the Edit Module first.
set WAP=%TLS_WAP_PATH%
if not defined TLS_WAP_PATH set WAP=C:\Users\Public\Yokogawa\tls\wap
del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\CIENG_Tank.xml"
del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_Tank.html"
del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\CIENG_Menu.xml"
del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_Menu.html"
del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\CIENG_TrendLab.xml"
del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\CIENG_TrendLab.html"
for %%d in (CIENG_Header CIENG_Overview CIENG_Control CIENG_Trends CIENG_Alarms CIENG_System CIENG_AlarmBanner CIENG_TankFaceplate) do (
if exist "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\%%d.xml" del /q "%WAP%\cfg\operatorInterfaces\DEPLOY\displays\%%d.xml"
if exist "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\%%d.html" del /q "%WAP%\mobileoperator\operatorInterfaces\DEPLOY\displays\%%d.html"
)

View file

@ -1,11 +1,13 @@
<!-- CIENG-SAMPLE-BEGIN: CI-Eng-Sample operator layout (CI Server R1.03.00).
<!-- CIENG-SAMPLE-BEGIN: CI-Eng-Sample operator layouts (CI Server R1.03.00).
Added and removed by examples\CI-Eng-Sample\layouts\layout.ps1; do not edit inside Layouts.xml.
Window: menu, toolbar, navigation frame "nav" (left), main frame "default" (right),
alarm banner frame (bottom), status line. The main frame is called "default" because the
AOG displays (alarm lists, faceplates) open their targets in a frame named "default". -->
CIENG_Operator: menu, navigation toolbar, header frame "hdr" (CIENG_Header), tab set "default"
with frames ovw / ctl / trd / alm / sys, alarm banner frame (CIENG_AlarmBanner), status line.
CIENG_Popup: faceplate window (CIENG_TankFaceplate). No AOG displays are used.
Desktop: frames inside a <tab> ignore their zoom attribute; the navigate commands carry
stretchDisplay instead (and CIENG_AlarmBanner opens the Overview tab that way at logon). -->
<layout
name="CIENG_Operator"
title="CI-Eng-Sample - $default"
title="CI-Eng-Sample Demo"
icon="poi.png"
drawBorder="true"
sizingAllowed="true"
@ -15,170 +17,90 @@
initialPosition="centreScreen"
initialPositionX="0"
initialPositionY="0"
initialSize="pixels"
initialSizeWidth="1600"
initialSizeHeight="900"
initialSize="desktopSize"
initialSizeWidth="1920"
initialSizeHeight="1040"
maximumOpen="1">
<menu>
<menu-item
name="cieng.menu.file"
label="File"
mnemonic="f">
<menu-item
name="cieng.menu.file.print"
label="Print..."
mnemonic="p"
tooltip="Print $"
command="print frameWithSetup"/>
<menu-item name="cieng.menu.file" label="File" mnemonic="f">
<menu-item name="cieng.menu.file.print" label="Print..." mnemonic="p" tooltip="Print the current tab" command="print frameWithSetup"/>
<menu-separator/>
<menu-item
name="cieng.menu.file.exit"
label="Exit"
mnemonic="x"
tooltip="Close this window"
command="exit"/>
<menu-item name="cieng.menu.file.logout" label="Log out" mnemonic="l" tooltip="Log out" command="logout"/>
<menu-item name="cieng.menu.file.exit" label="Exit" mnemonic="x" tooltip="Close this window" command="exit"/>
</menu-item>
<menu-item
name="cieng.menu.view"
label="View"
mnemonic="v">
<menu-item
name="cieng.menu.view.reload"
label="Reload"
mnemonic="r"
accelerator="F5"
tooltip="Reload $"
command="reload default"/>
<menu-item
name="cieng.menu.view.reload.all"
label="Reload All"
mnemonic="a"
tooltip="Reload all displays"
command="reload all"/>
<menu-item name="cieng.menu.view" label="View" mnemonic="v">
<menu-item name="cieng.menu.view.reload" label="Reload all" mnemonic="r" accelerator="F5" tooltip="Reload all displays" command="reload all"/>
<menu-item name="cieng.menu.view.fullscreen" label="Full screen" mnemonic="u" accelerator="F11" tooltip="Toggle full screen" command="toggleSize fullScreen"/>
<menu-separator/>
<menu-item
name="cieng.menu.view.fullscreen"
label="Full screen"
mnemonic="u"
accelerator="F11"
tooltip="Toggle full screen"
command="toggleSize fullScreen"/>
<menu-item name="cieng.menu.view.toolbar" label="Toolbar" mnemonic="t" type="check" tooltip="Show or hide the toolbar" command="toolbar"/>
<menu-item name="cieng.menu.view.status" label="Status line" mnemonic="s" type="check" tooltip="Show or hide the status line" command="statusline"/>
</menu-item>
<menu-item
name="cieng.menu.displays"
label="Displays"
mnemonic="d">
<menu-item
name="cieng.menu.displays.tank"
label="Tank 1"
mnemonic="t"
tooltip="Tank 1 overview"
command="navigate to default CIENG_Tank fitDisplay"/>
<menu-separator/>
<menu-item
name="cieng.menu.displays.alarmCurrent"
label="Current alarms"
mnemonic="c"
tooltip="Current alarm list"
command="navigate to default AOG_AlarmCurrent"/>
<menu-item
name="cieng.menu.displays.alarmHistory"
label="Alarm history"
mnemonic="h"
tooltip="Historical alarm list"
command="navigate to default AOG_AlarmHistory"/>
<menu-item
name="cieng.menu.displays.trend"
label="Trend"
mnemonic="r"
tooltip="Trend display"
command="navigate to default AOG_TrendOpen"/>
<menu-item name="cieng.menu.displays" label="Displays" mnemonic="d">
<menu-item name="cieng.menu.displays.ovw" label="Overview" mnemonic="o" accelerator="F1" command="navigate to ovw CIENG_Overview stretchDisplay"/>
<menu-item name="cieng.menu.displays.ctl" label="Process control" mnemonic="p" accelerator="F2" command="navigate to ctl CIENG_Control stretchDisplay"/>
<menu-item name="cieng.menu.displays.trd" label="Trends" mnemonic="t" accelerator="F3" command="navigate to trd CIENG_Trends stretchDisplay"/>
<menu-item name="cieng.menu.displays.alm" label="Alarms" mnemonic="a" accelerator="F4" command="navigate to alm CIENG_Alarms stretchDisplay"/>
<menu-item name="cieng.menu.displays.sys" label="System" mnemonic="s" accelerator="F6" command="navigate to sys CIENG_System stretchDisplay"/>
</menu-item>
</menu>
<toolbar
name="cieng.toolbar"
label="CI-Eng-Sample"
floatable="false"
position="top">
<toolbar-item
name="cieng.toolbar.back"
icon="ciNavLeft32.png"
label=""
tooltip="Back to $"
command="navigate back default"/>
<toolbar-item
name="cieng.toolbar.forward"
icon="ciNavRight32.png"
label=""
tooltip="Forward to $"
command="navigate forward default"/>
<toolbar-item
name="cieng.toolbar.home"
icon="ciOverview32.png"
label=""
tooltip="Home to $"
command="navigate home default"/>
<toolbar-item
name="cieng.toolbar.history"
tooltip="History"
label="History"
type="editableCombo"
command="navigate history default"/>
<toolbar name="cieng.toolbar" label="Navigation" floatable="false" position="top">
<toolbar-item name="cieng.toolbar.back" icon="ciNavLeft32.png" label="" tooltip="Back to $" command="navigate back ovw"/>
<toolbar-item name="cieng.toolbar.forward" icon="ciNavRight32.png" label="" tooltip="Forward to $" command="navigate forward ovw"/>
<toolbar-item name="cieng.toolbar.home" icon="ciOverview32.png" label="" tooltip="Home: Overview" command="navigate home ovw"/>
<toolbar-separator/>
<toolbar-item
name="cieng.toolbar.alarmCurrent"
icon="ciProAlar32.png"
label=""
tooltip="Current alarm list"
command="navigate to default AOG_AlarmCurrent"/>
<toolbar-item
name="cieng.toolbar.zoomFit"
icon="ciZoomFull32.png"
label=""
tooltip="Fit display"
command="zoom 0 default"/>
<toolbar-item name="cieng.toolbar.ovw" label="Overview" tooltip="Overview (F1)" command="navigate to ovw CIENG_Overview stretchDisplay"/>
<toolbar-item name="cieng.toolbar.ctl" label="Process control" tooltip="Process control (F2)" command="navigate to ctl CIENG_Control stretchDisplay"/>
<toolbar-item name="cieng.toolbar.trd" label="Trends" tooltip="Trends (F3)" command="navigate to trd CIENG_Trends stretchDisplay"/>
<toolbar-item name="cieng.toolbar.alm" icon="ciProAlar32.png" label="Alarms" tooltip="Alarms (F4)" command="navigate to alm CIENG_Alarms stretchDisplay"/>
<toolbar-item name="cieng.toolbar.sys" label="System" tooltip="System (F6)" command="navigate to sys CIENG_System stretchDisplay"/>
<toolbar-separator/>
<toolbar-item name="cieng.toolbar.reload" label="Reload" tooltip="Reload all displays" command="reload all"/>
<toolbar-item name="cieng.toolbar.full" icon="ciZoomFull32.png" label="" tooltip="Full screen" command="toggleSize fullScreen"/>
</toolbar>
<frame-set
rows="1*,fitDisplay"
borderStyle="none">
<frame-set
cols="fitDisplay,1*"
borderStyle="none">
<frame
name="nav"
stackSize="1"
zoomingAllowed="false"
scrollingAllowed="false"
initialDisplay="CIENG_Menu"
borderStyle="none"/>
<frame
name="default"
stackSize="10"
zoomingAllowed="true"
scrollingAllowed="true"
initialDisplay="CIENG_Tank"
borderStyle="line"
zoom="fitDisplay"/>
</frame-set>
<frame
name="alarmBannerFrame"
zoomingAllowed="false"
initialDisplay="AOG_AlarmBanner"
borderStyle="none"
zoom="stretchDisplay"/>
<!-- The tab set must be the LAST child of its frame-set: the web client (R1.03) binds the tab
click handler to the last panel created in the frame-set. -->
<frame-set rows="1*,fitDisplay" borderStyle="none">
<frame-set rows="fitDisplay,1*" borderStyle="none">
<frame name="hdr" stackSize="1" zoomingAllowed="false" scrollingAllowed="false" initialDisplay="CIENG_Header" borderStyle="none" zoom="stretchDisplay"/>
<tab stackSize="10" name="default" zoomingAllowed="true" scrollingAllowed="true" zoom="stretchDisplay" closeTabAllowed="false" borderStyle="none" tabPosition="top" maximumTabs="5">
<frame name="ovw" stackSize="10" zoomingAllowed="true" scrollingAllowed="true" initialDisplay="CIENG_Overview" closeTabAllowed="false" borderStyle="none" zoom="stretchDisplay"/>
<frame name="ctl" stackSize="10" zoomingAllowed="true" scrollingAllowed="true" initialDisplay="CIENG_Control" closeTabAllowed="false" borderStyle="none" zoom="stretchDisplay"/>
<frame name="trd" stackSize="10" zoomingAllowed="true" scrollingAllowed="true" initialDisplay="CIENG_Trends" closeTabAllowed="false" borderStyle="none" zoom="stretchDisplay"/>
<frame name="alm" stackSize="10" zoomingAllowed="true" scrollingAllowed="true" initialDisplay="CIENG_Alarms" closeTabAllowed="false" borderStyle="none" zoom="stretchDisplay"/>
<frame name="sys" stackSize="10" zoomingAllowed="true" scrollingAllowed="true" initialDisplay="CIENG_System" closeTabAllowed="false" borderStyle="none" zoom="stretchDisplay"/>
</tab>
</frame-set>
<frame name="alarmBannerFrame" stackSize="1" zoomingAllowed="false" scrollingAllowed="false" initialDisplay="CIENG_AlarmBanner" borderStyle="none" zoom="stretchDisplay"/>
</frame-set>
<status-line>
<status-line-item
type="statusText"/>
<status-line-item type="statusText"/>
<status-line-separator/>
<status-line-item
type="displayName"/>
<status-line-item type="displayName"/>
<status-line-separator/>
<status-line-item
type="userName"/>
<status-line-item type="userName"/>
<status-line-separator/>
<status-line-item
type="dateTime"/>
<status-line-item type="dateTime"/>
</status-line>
</layout>
<layout
name="CIENG_Popup"
title="$default"
icon="poi.png"
drawBorder="true"
sizingAllowed="false"
minimizingAllowed="false"
closingAllowed="true"
alwaysOnTop="true"
modal="false"
initialPosition="atCursor"
initialPositionX="0"
initialPositionY="0"
initialSize="fitFrames"
initialSizeWidth="420"
initialSizeHeight="600"
maximumOpen="3">
<frame-set rows="1*">
<frame name="default" stackSize="1" zoomingAllowed="false" scrollingAllowed="false" initialDisplay="CIENG_TankFaceplate" borderStyle="none"/>
</frame-set>
</layout>
<!-- CIENG-SAMPLE-END -->

View file

@ -31,4 +31,4 @@ if (-not $Remove) {
# Check that the result is still well-formed XML before writing it.
[xml]$null = $text
[IO.File]::WriteAllText($file, $text, (New-Object Text.UTF8Encoding($false)))
if ($Remove) { 'CIENG_Operator layout removed' } else { 'CIENG_Operator layout added' }
if ($Remove) { 'CIENG_Operator / CIENG_Popup layouts removed' } else { 'CIENG_Operator / CIENG_Popup layouts added' }