From abdac436aae90a9eb170df72d87d7141daec7238 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 14 Sep 2020 07:29:51 -0700 Subject: [PATCH 01/17] updating the example configuration file of the verification tool --- specification/source/verification.rst | 46 +++++++++++++++++---------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/specification/source/verification.rst b/specification/source/verification.rst index f85732c6..ff2d4782 100644 --- a/specification/source/verification.rst +++ b/specification/source/verification.rst @@ -517,29 +517,43 @@ To verify the sequences of its instances ``setPoiVAV`` and ``setPoiVAV1``, a spe .. code-block:: :name: sec_ver_spe_tes_set - :caption: Specification of test setup. - - references : [ - { "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", - "sequence" : "setPoiVAV" }, - { "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", - "sequence" : "setPoiVAV1", - "tolerances": {"atoly": 0.5, "variable": "setPoiVAV1.TSup*" }, - "indicator": "fanSta.y", - "sampling": {"max": 60} - } + :caption: Configuration of test setup. + + { + "references": [ + { + "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", + "sequence": "setPoiVAV", + "pointNameMapping": "realControllerPointMapping.json" + }, + { + "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", + "sequence": "setPoiVAV1", + "pointNameMapping": "realControllerPointMapping.json" + "tolerances": [ + { "atoly": 0.5, "variable": "setPoiVAV1.TSup*" } + ], + "indicators": [ + { "setPoiVAV1.TSup*": [ "fanSta.y" ] } + ], + "sampling": 60 + } ], - "tolerances": {"rtolx": 0.002, "rtoly": 0.002, "atolx": 10, "atoly": 0}, - "sampling": {"max": 120} + "tolerances": { "rtolx": 0.002, "rtoly": 0.002, "atolx": 10, "atoly": 0 }, + "sampling": 120 + } This specifies two tests, one for the controller ``setPoiVAV`` and one for ``setPoiVAV1``. (In this example, ``setPoiVAV`` and ``setPoiVAV1`` happen to be the same sequence, but their input time series and/or parameters are different, and therefore their output time series will be different.) The test for ``setPoiVAV`` will use the globally specified tolerances, and use -a maximum sampling rate of :math:`120` seconds. +a sampling rate of :math:`120` seconds. The mapping of the variables to the I/O points of the real controller +is provided in the file ``realControllerPointMapping.json``. The test for ``setPoiVAV1`` will use different tolerances on each output variable that matches -the regular expression ``setPoiVAV1.TSup*``. Moreover, the test will be suspended whenever -``fanSta.y = false``, and the maximum sampling rate is :math:`60` seconds. +the regular expression ``setPoiVAV1.TSup*``. Moreover, for each variable that matches the regular +expression, ``setPoiVAV1.TSup*``, the verification will be suspended whenever +``fanSta.y = false``, and the sampling rate is :math:`60` seconds. This test will also use +``realControllerPointMapping.json`` to map the variables to points of the real controller. The tolerances ``rtolx`` and ``atolx`` are relative and absolute tolerances in the independent variable, e.g., in time, and ``rtoly`` and ``atoly`` are relative and absolute tolerances in the control output variable. From d11b9612e9338df895eedb0b01234190e9cb077c Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 14 Sep 2020 07:42:22 -0700 Subject: [PATCH 02/17] fixing a typo in the cdl verification tool example configuraiton --- specification/source/verification.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specification/source/verification.rst b/specification/source/verification.rst index ff2d4782..90dfefa5 100644 --- a/specification/source/verification.rst +++ b/specification/source/verification.rst @@ -529,7 +529,7 @@ To verify the sequences of its instances ``setPoiVAV`` and ``setPoiVAV1``, a spe { "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", "sequence": "setPoiVAV1", - "pointNameMapping": "realControllerPointMapping.json" + "pointNameMapping": "realControllerPointMapping.json", "tolerances": [ { "atoly": 0.5, "variable": "setPoiVAV1.TSup*" } ], From eca5ef02f83ea98e44f049d732d372b0045cfd9c Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 28 Sep 2020 18:00:29 -0700 Subject: [PATCH 03/17] first commit of the cdl verification tool software --- software/verification/.gitignore | 1 + software/verification/config_template.json | 12 + ...one.VAV.SetPoints.Validation.Supply_u.json | 23550 ++++++++++++++++ software/verification/verifyCdlSequence.py | 107 + 4 files changed, 23670 insertions(+) create mode 100644 software/verification/.gitignore create mode 100644 software/verification/config_template.json create mode 100644 software/verification/test/Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u.json create mode 100644 software/verification/verifyCdlSequence.py diff --git a/software/verification/.gitignore b/software/verification/.gitignore new file mode 100644 index 00000000..d344ba6b --- /dev/null +++ b/software/verification/.gitignore @@ -0,0 +1 @@ +config.json diff --git a/software/verification/config_template.json b/software/verification/config_template.json new file mode 100644 index 00000000..4e58e3e2 --- /dev/null +++ b/software/verification/config_template.json @@ -0,0 +1,12 @@ +{ + "references": [ + { + "model": "", + "sequence": "", + "pointNameMapping": "" + } + ], + "modelJsonDirectory": "", + "tolerances": { "rtolx": <>, "rtoly": <>, "atolx": <>, "atoly": <> }, + "sampling": <> +} diff --git a/software/verification/test/Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u.json b/software/verification/test/Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u.json new file mode 100644 index 00000000..8bf2e2f6 --- /dev/null +++ b/software/verification/test/Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u.json @@ -0,0 +1,23550 @@ +[ + { + "modelicaFile": "Buildings/Controls/OBC/ASHRAE/G36_PR1/AHUs/SingleZone/VAV/SetPoints/Validation/Supply_u.mo", + "within": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation", + "topClassName": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", + "comment": "Validation model for temperature and fan speed", + "public": { + "models": [ + { + "className": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply", + "name": "setPoiVAV", + "comment": "Block that computes the setpoints for temperature and fan speed", + "modifications": [ + { + "name": "yHeaMax", + "value": "0.7", + "isFinal": false + }, + { + "name": "yMin", + "value": "0.3", + "isFinal": false + }, + { + "name": "TSupSetMax", + "value": "303.15", + "isFinal": false + }, + { + "name": "TSupSetMin", + "value": "289.15", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": 40 + }, + { + "x": 20, + "y": 60 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply", + "name": "setPoiVAV1", + "comment": "Block that computes the setpoints for temperature and fan speed", + "modifications": [ + { + "name": "yHeaMax", + "value": "0.7", + "isFinal": false + }, + { + "name": "yMin", + "value": "0.3", + "isFinal": false + }, + { + "name": "TSupSetMax", + "value": "303.15", + "isFinal": false + }, + { + "name": "TSupSetMin", + "value": "289.15", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": 0 + }, + { + "x": 20, + "y": 20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply", + "name": "setPoiVAV2", + "comment": "Block that computes the setpoints for temperature and fan speed", + "modifications": [ + { + "name": "yHeaMax", + "value": "0.7", + "isFinal": false + }, + { + "name": "yMin", + "value": "0.3", + "isFinal": false + }, + { + "name": "TSupSetMax", + "value": "303.15", + "isFinal": false + }, + { + "name": "TSupSetMin", + "value": "289.15", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": -40 + }, + { + "x": 20, + "y": -20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "TZon", + "comment": "Zone air temperature", + "modifications": [ + { + "name": "k", + "value": "273.15 + 28", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -20 + }, + { + "x": -60, + "y": 0 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "TOut", + "comment": "Outdoor temperature", + "modifications": [ + { + "name": "k", + "value": "273.15 + 22", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -50 + }, + { + "x": -60, + "y": -30 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Ramp", + "name": "uHea", + "comment": "Heating control signal", + "modifications": [ + { + "name": "duration", + "value": "0.25", + "isFinal": false + }, + { + "name": "height", + "value": "-1", + "isFinal": false + }, + { + "name": "offset", + "value": "1", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 70 + }, + { + "x": -60, + "y": 90 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Ramp", + "name": "uCoo", + "comment": "Cooling control signal", + "modifications": [ + { + "name": "duration", + "value": "0.25", + "isFinal": false + }, + { + "name": "startTime", + "value": "0.75", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 40 + }, + { + "x": -60, + "y": 60 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "TZonSet", + "comment": "Average zone set point", + "modifications": [ + { + "name": "k", + "value": "273.15 + 23", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 10 + }, + { + "x": -60, + "y": 30 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "TZon1", + "comment": "Zone air temperature", + "modifications": [ + { + "name": "k", + "value": "273.15 + 23", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -80 + }, + { + "x": -60, + "y": -60 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Logical.Sources.Constant", + "name": "fanSta", + "comment": "Fan is on", + "modifications": [ + { + "name": "k", + "value": "true", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -110 + }, + { + "x": -60, + "y": -90 + } + ] + } + } + } + ] + }, + "vendorAnnotation": { + "__Dymola_Commands": { + "file": "\"modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/ASHRAE/G36_PR1/AHUs/SingleZone/VAV/SetPoints/Validation/Supply_u.mos\" \"Simulate and plot" + } + }, + "info": "\n

\nThis example validates\n\nBuildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply\nfor different control signals.\nEach controller is configured identical, but the input signal for TZon differs\nin order to validate that the fan speed is increased correctly.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -120 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "fillColor": { + "r": 75, + "g": 138, + "b": 73 + }, + "pattern": "LinePattern.None", + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -36, + "y": 60 + }, + { + "x": 64, + "y": 0 + }, + { + "x": -36, + "y": -60 + }, + { + "x": -36, + "y": 60 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineThickness": 0.25 + } + ], + "ellipse": [ + { + "lineColor": { + "r": 75, + "g": 138, + "b": 73 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + } + ] + } + }, + "diagram": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -120 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + } + }, + "connections": [ + [ + { + "instance": "TZon", + "connector": "y" + }, + { + "instance": "setPoiVAV", + "connector": "TZon", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TZon" + }, + { + "points": [ + { + "x": -58, + "y": -10 + }, + { + "x": -31.5, + "y": -10 + }, + { + "x": -31.5, + "y": 48.3333 + }, + { + "x": -2, + "y": 48.3333 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Dash", + "thickness": 0.25 + } + ], + [ + { + "instance": "TOut", + "connector": "y" + }, + { + "instance": "setPoiVAV", + "connector": "TOut", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TOut" + }, + { + "points": [ + { + "x": -58, + "y": -40 + }, + { + "x": -24, + "y": -40 + }, + { + "x": -24, + "y": 45 + }, + { + "x": -2, + "y": 45 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uHea", + "connector": "y" + }, + { + "instance": "setPoiVAV", + "connector": "uHea", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uHea" + }, + { + "points": [ + { + "x": -58, + "y": 80 + }, + { + "x": -12, + "y": 80 + }, + { + "x": -12, + "y": 58.3333 + }, + { + "x": -2, + "y": 58.3333 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uCoo", + "connector": "y" + }, + { + "instance": "setPoiVAV", + "connector": "uCoo", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uCoo" + }, + { + "points": [ + { + "x": -58, + "y": 50 + }, + { + "x": -16, + "y": 50 + }, + { + "x": -16, + "y": 55 + }, + { + "x": -2, + "y": 55 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TZonSet", + "connector": "y" + }, + { + "instance": "setPoiVAV", + "connector": "TZonSet", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TZonSet" + }, + { + "points": [ + { + "x": -58, + "y": 20 + }, + { + "x": -10, + "y": 20 + }, + { + "x": -10, + "y": 51.6667 + }, + { + "x": -2, + "y": 51.6667 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TOut", + "connector": "y" + }, + { + "instance": "setPoiVAV1", + "connector": "TOut", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TOut" + }, + { + "points": [ + { + "x": -58, + "y": -40 + }, + { + "x": -24, + "y": -40 + }, + { + "x": -24, + "y": 5 + }, + { + "x": -2, + "y": 5 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uHea", + "connector": "y" + }, + { + "instance": "setPoiVAV1", + "connector": "uHea", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uHea" + }, + { + "points": [ + { + "x": -58, + "y": 80 + }, + { + "x": -12, + "y": 80 + }, + { + "x": -12, + "y": 18.3333 + }, + { + "x": -2, + "y": 18.3333 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uCoo", + "connector": "y" + }, + { + "instance": "setPoiVAV1", + "connector": "uCoo", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uCoo" + }, + { + "points": [ + { + "x": -58, + "y": 50 + }, + { + "x": -16, + "y": 50 + }, + { + "x": -16, + "y": 15 + }, + { + "x": -2, + "y": 15 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TZonSet", + "connector": "y" + }, + { + "instance": "setPoiVAV1", + "connector": "TZonSet", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TZonSet" + }, + { + "points": [ + { + "x": -58, + "y": 20 + }, + { + "x": -10, + "y": 20 + }, + { + "x": -10, + "y": 11.6667 + }, + { + "x": -2, + "y": 11.6667 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TOut", + "connector": "y" + }, + { + "instance": "setPoiVAV2", + "connector": "TOut", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TOut" + }, + { + "points": [ + { + "x": -58, + "y": -40 + }, + { + "x": -24, + "y": -40 + }, + { + "x": -24, + "y": -35 + }, + { + "x": -2, + "y": -35 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uHea", + "connector": "y" + }, + { + "instance": "setPoiVAV2", + "connector": "uHea", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uHea" + }, + { + "points": [ + { + "x": -58, + "y": 80 + }, + { + "x": -12, + "y": 80 + }, + { + "x": -12, + "y": -21.6667 + }, + { + "x": -2, + "y": -21.6667 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uCoo", + "connector": "y" + }, + { + "instance": "setPoiVAV2", + "connector": "uCoo", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uCoo" + }, + { + "points": [ + { + "x": -58, + "y": 50 + }, + { + "x": -16, + "y": 50 + }, + { + "x": -16, + "y": -25 + }, + { + "x": -2, + "y": -25 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TZonSet", + "connector": "y" + }, + { + "instance": "setPoiVAV2", + "connector": "TZonSet", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TZonSet" + }, + { + "points": [ + { + "x": -58, + "y": 20 + }, + { + "x": -10, + "y": 20 + }, + { + "x": -10, + "y": -28.3333 + }, + { + "x": -2, + "y": -28.3333 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TOut", + "connector": "y" + }, + { + "instance": "setPoiVAV1", + "connector": "TZon", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TZon" + }, + { + "points": [ + { + "x": -58, + "y": -40 + }, + { + "x": -24, + "y": -40 + }, + { + "x": -24, + "y": 8.33333 + }, + { + "x": -2, + "y": 8.33333 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Dash", + "thickness": 0.25 + } + ], + [ + { + "instance": "TZon1", + "connector": "y" + }, + { + "instance": "setPoiVAV2", + "connector": "TZon", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.TZon" + }, + { + "points": [ + { + "x": -58, + "y": -70 + }, + { + "x": -20, + "y": -70 + }, + { + "x": -20, + "y": -31.6667 + }, + { + "x": -2, + "y": -31.6667 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Dash", + "thickness": 0.25 + } + ], + [ + { + "instance": "fanSta", + "connector": "y" + }, + { + "instance": "setPoiVAV", + "connector": "uFan", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uFan" + }, + { + "points": [ + { + "x": -58, + "y": -100 + }, + { + "x": -6, + "y": -100 + }, + { + "x": -6, + "y": 41.6667 + }, + { + "x": -2, + "y": 41.6667 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 255 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "setPoiVAV1", + "connector": "uFan", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uFan" + }, + { + "instance": "setPoiVAV", + "connector": "uFan", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uFan" + }, + { + "points": [ + { + "x": -2, + "y": 1.66667 + }, + { + "x": -6, + "y": 1.66667 + }, + { + "x": -6, + "y": 41.6667 + }, + { + "x": -2, + "y": 41.6667 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 255 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "setPoiVAV2", + "connector": "uFan", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uFan" + }, + { + "instance": "setPoiVAV", + "connector": "uFan", + "portLinkTarget": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply.uFan" + }, + { + "points": [ + { + "x": -2, + "y": -38.3333 + }, + { + "x": -6, + "y": -38.3333 + }, + { + "x": -6, + "y": 41.6667 + }, + { + "x": -2, + "y": 41.6667 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 255 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ] + ], + "svg": { + "icon": { + "items": { + "width": 200, + "height": 220, + "layerPolygons": [ + { + "points": "64,40 164,100 64,160 64,40", + "hasFill": true, + "fill": "rgb(75,138,73)", + "stroke": "rgb(0,0,255)", + "strokeWidth": 0.25 + } + ], + "layerEllipses": [ + { + "cx": 100, + "cy": 100, + "rx": 100, + "ry": 100, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(75,138,73)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false + }, + "coordinate": [ + { + "x": 0, + "y": 220 + }, + { + "x": 200, + "y": 0 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "diagram": { + "items": { + "width": 200, + "height": 220, + "connectionPolylines": [ + { + "points": "42,110 68.5,110 68.5,51.6667 98,51.6667", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "2,2", + "strokeWidth": 1.25 + }, + { + "points": "42,110 68.5,110 68.5,51.6667 98,51.6667", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "2,2", + "strokeWidth": 0.25 + }, + { + "points": "42,140 76,140 76,55 98,55", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,140 76,140 76,55 98,55", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,20 88,20 88,41.6667 98,41.6667", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,20 88,20 88,41.6667 98,41.6667", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,50 84,50 84,45 98,45", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,50 84,50 84,45 98,45", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,80 90,80 90,48.3333 98,48.3333", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,80 90,80 90,48.3333 98,48.3333", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,140 76,140 76,95 98,95", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,140 76,140 76,95 98,95", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,20 88,20 88,81.66669999999999 98,81.66669999999999", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,20 88,20 88,81.66669999999999 98,81.66669999999999", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,50 84,50 84,85 98,85", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,50 84,50 84,85 98,85", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,80 90,80 90,88.3333 98,88.3333", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,80 90,80 90,88.3333 98,88.3333", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,140 76,140 76,135 98,135", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,140 76,140 76,135 98,135", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,20 88,20 88,121.66669999999999 98,121.66669999999999", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,20 88,20 88,121.66669999999999 98,121.66669999999999", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,50 84,50 84,125 98,125", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,50 84,50 84,125 98,125", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,80 90,80 90,128.3333 98,128.3333", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,80 90,80 90,128.3333 98,128.3333", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "42,140 76,140 76,91.66667 98,91.66667", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "2,2", + "strokeWidth": 1.25 + }, + { + "points": "42,140 76,140 76,91.66667 98,91.66667", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "2,2", + "strokeWidth": 0.25 + }, + { + "points": "42,170 80,170 80,131.6667 98,131.6667", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "2,2", + "strokeWidth": 1.25 + }, + { + "points": "42,170 80,170 80,131.6667 98,131.6667", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "2,2", + "strokeWidth": 0.25 + }, + { + "points": "42,200 94,200 94,58.3333 98,58.3333", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "42,200 94,200 94,58.3333 98,58.3333", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,98.33333 94,98.33333 94,58.3333 98,58.3333", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "98,98.33333 94,98.33333 94,58.3333 98,58.3333", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,138.3333 94,138.3333 94,58.3333 98,58.3333", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "98,138.3333 94,138.3333 94,58.3333 98,58.3333", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": true, + "connectionLineDots": [ + { + "cx": 76, + "cy": 95, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 88, + "cy": 41.6667, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 50, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 90, + "cy": 80, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 76, + "cy": 135, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 76, + "cy": 135, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 88, + "cy": 41.6667, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 88, + "cy": 81.66669999999999, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 50, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 85, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 90, + "cy": 80, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 90, + "cy": 88.3333, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 76, + "cy": 91.66667, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 76, + "cy": 95, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 76, + "cy": 135, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 94, + "cy": 98.33333, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 94, + "cy": 138.3333, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 94, + "cy": 98.33333, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "classRectangles": [ + { + "x": 100, + "y": 40, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 100, + "y": 80, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 100, + "y": 120, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 20, + "y": 100, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 20, + "y": 130, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 20, + "y": 10, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 20, + "y": 40, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 20, + "y": 70, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 20, + "y": 160, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 20, + "y": 190, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(210,210,210)", + "stroke": "rgb(0,0,0)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 19.908, + "y": 189.908, + "width": 0.092, + "height": 20.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 19.908, + "y": 210, + "width": 20.092, + "height": 0.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 40, + "y": 190, + "width": 0.092, + "height": 20.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.2 + }, + { + "x": 20, + "y": 189.908, + "width": 20.092, + "height": 0.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 20, + "y": 190, + "width": 0.13799999999999998, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 20, + "y": 190, + "width": 20, + "height": 0.13799999999999998, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 39.908, + "y": 190, + "width": 0.092, + "height": 20, + "hasFill": true, + "fill": "rgb(113,111,100)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.2 + }, + { + "x": 20, + "y": 209.90800000000002, + "width": 20, + "height": 0.092, + "hasFill": true, + "fill": "rgb(113,111,100)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 39.816, + "y": 190.092, + "width": 0.092, + "height": 19.816000000000003, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.2 + }, + { + "x": 20.092, + "y": 209.816, + "width": 19.816, + "height": 0.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + } + ], + "classPolygons": [ + { + "points": "118,56.33333333333333 115.8,55.833333333333336 115.8,56.83333333333333 118,56.33333333333333", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,50 104,51.83333333333333 105.2,51.83333333333333 104.6,50", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "103.6,56.33333333333333 105.8,55.833333333333336 105.8,56.83333333333333 103.6,56.33333333333333", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,44 104,45.833333333333336 105.2,45.833333333333336 104.6,44", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,42.5 100,41.666666666666664 98,40.833333333333336", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,45.833333333333336 100,45 98,44.166666666666664", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,49.166666666666664 100,48.333333333333336 98,47.5", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,52.5 100,51.666666666666664 98,50.833333333333336", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,55.833333333333336 100,55 98,54.166666666666664", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,59.166666666666664 100,58.333333333333336 98,57.5", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,45.833333333333336 122,45 120,44.166666666666664", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,50.833333333333336 122,50 120,49.166666666666664", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,55.833333333333336 122,55 120,54.166666666666664", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,96.33333333333333 115.8,95.83333333333334 115.8,96.83333333333333 118,96.33333333333333", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,90 104,91.83333333333333 105.2,91.83333333333333 104.6,90", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "103.6,96.33333333333333 105.8,95.83333333333334 105.8,96.83333333333333 103.6,96.33333333333333", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,84 104,85.83333333333333 105.2,85.83333333333333 104.6,84", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,82.5 100,81.66666666666667 98,80.83333333333333", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,85.83333333333333 100,85 98,84.16666666666667", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,89.16666666666667 100,88.33333333333333 98,87.5", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,92.5 100,91.66666666666666 98,90.83333333333333", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,95.83333333333334 100,95 98,94.16666666666666", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,99.16666666666666 100,98.33333333333334 98,97.5", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,85.83333333333333 122,85 120,84.16666666666667", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,90.83333333333333 122,90 120,89.16666666666667", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,95.83333333333334 122,95 120,94.16666666666666", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,136.33333333333334 115.8,135.83333333333334 115.8,136.83333333333334 118,136.33333333333334", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,130 104,131.83333333333334 105.2,131.83333333333334 104.6,130", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "103.6,136.33333333333334 105.8,135.83333333333334 105.8,136.83333333333334 103.6,136.33333333333334", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,124 104,125.83333333333333 105.2,125.83333333333333 104.6,124", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,122.5 100,121.66666666666667 98,120.83333333333333", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,125.83333333333333 100,125 98,124.16666666666667", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,129.16666666666666 100,128.33333333333334 98,127.5", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,132.5 100,131.66666666666666 98,130.83333333333334", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,135.83333333333334 100,135 98,134.16666666666666", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "98,139.16666666666666 100,138.33333333333334 98,137.5", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,125.83333333333333 122,125 120,124.16666666666667", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,130.83333333333334 122,130 120,129.16666666666666", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,135.83333333333334 122,135 120,134.16666666666666", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,101 21.2,103.2 22.8,103.2 22,101", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "39,117 36.8,116.2 36.8,117.8 39,117", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "40,111 42,110 40,109", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,131 21.2,133.2 22.8,133.2 22,131", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "39,147 36.8,146.2 36.8,147.8 39,147", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "40,141 42,140 40,139", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,11 21.2,13.2 22.8,13.2 22,11", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "39,27 36.8,26.2 36.8,27.8 39,27", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "40,21 42,20 40,19", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,41 21.2,43.2 22.8,43.2 22,41", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "39,57 36.8,56.2 36.8,57.8 39,57", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "40,51 42,50 40,49", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,71 21.2,73.2 22.8,73.2 22,71", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "39,87 36.8,86.2 36.8,87.8 39,87", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "40,81 42,80 40,79", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,161 21.2,163.2 22.8,163.2 22,161", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "39,177 36.8,176.2 36.8,177.8 39,177", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "40,171 42,170 40,169", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "39,207 36.8,206.2 36.8,207.8 39,207", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,191.2 21.2,193.4 22.8,193.4 22,191.2", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "40,201 42,200 40,199", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "classEllipses": [ + { + "cx": 37.8, + "cy": 200, + "rx": 0.7000000000000001, + "ry": 0.7, + "hasFill": true, + "fill": "rgb(235,235,235)", + "hasPattern": true, + "stroke": "rgb(235,235,235)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "classPolylines": [ + { + "points": "110.8,56.33333333333333 117.8,56.33333333333333", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,51.83333333333333 104.6,55.16666666666667", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "105.6,50.5 107,50.5 108.6,53.5 112.6,53.5 113.8,55.16666666666667 116,55.16666666666667", + "fill": "none", + "stroke": "rgb(0,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "105.6,50.5 107,50.5 108.6,53.5 110.2,53.5 111.8,55.5 116,55.5", + "fill": "none", + "stroke": "rgb(255,0,0)", + "strokeDasharray": "1,2", + "strokeWidth": 0.5 + }, + { + "points": "109.6,56.33333333333333 104,56.33333333333333", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,45.833333333333336 104.6,49.166666666666664", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "105.4,46.333333333333336 107.2,48.333333333333336 111.8,48.333333333333336 112.8,47 113.8,47 115,45.5", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "111.8,48.333333333333336 113.8,48.333333333333336 115,45.5 112.8,45.5 111.8,48.333333333333336", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "110.8,96.33333333333333 117.8,96.33333333333333", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,91.83333333333333 104.6,95.16666666666667", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "105.6,90.5 107,90.5 108.6,93.5 112.6,93.5 113.8,95.16666666666667 116,95.16666666666667", + "fill": "none", + "stroke": "rgb(0,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "105.6,90.5 107,90.5 108.6,93.5 110.2,93.5 111.8,95.5 116,95.5", + "fill": "none", + "stroke": "rgb(255,0,0)", + "strokeDasharray": "1,2", + "strokeWidth": 0.5 + }, + { + "points": "109.6,96.33333333333333 104,96.33333333333333", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,85.83333333333333 104.6,89.16666666666667", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "105.4,86.33333333333333 107.2,88.33333333333333 111.8,88.33333333333333 112.8,87 113.8,87 115,85.5", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "111.8,88.33333333333333 113.8,88.33333333333333 115,85.5 112.8,85.5 111.8,88.33333333333333", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "110.8,136.33333333333334 117.8,136.33333333333334", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,131.83333333333334 104.6,135.16666666666666", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "105.6,130.5 107,130.5 108.6,133.5 112.6,133.5 113.8,135.16666666666666 116,135.16666666666666", + "fill": "none", + "stroke": "rgb(0,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "105.6,130.5 107,130.5 108.6,133.5 110.2,133.5 111.8,135.5 116,135.5", + "fill": "none", + "stroke": "rgb(255,0,0)", + "strokeDasharray": "1,2", + "strokeWidth": 0.5 + }, + { + "points": "109.6,136.33333333333334 104,136.33333333333334", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104.6,125.83333333333333 104.6,129.16666666666666", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "105.4,126.33333333333333 107.2,128.33333333333334 111.8,128.33333333333334 112.8,127 113.8,127 115,125.5", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "111.8,128.33333333333334 113.8,128.33333333333334 115,125.5 112.8,125.5 111.8,128.33333333333334", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,103.2 22,118", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "21,117 38.2,117", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,110 38,110", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,133.2 22,148", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "21,147 38.2,147", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,140 38,140", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,13.2 22,28", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "21,27 38.2,27", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,27 26,27 33.1,16.200000000000003", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "33.1,16.200000000000003 38.599999999999994,16.200000000000003", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,43.2 22,58", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "21,57 38.2,57", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,57 26,57 33.1,46.2", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "33.1,46.2 38.599999999999994,46.2", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,73.2 22,88", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "21,87 38.2,87", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,80 38,80", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,163.2 22,178", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "21,177 38.2,177", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,170 38,170", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "21,207 37.2,207", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,193.4 22,208.2", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "22,200 36.400000000000006,200", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "classTexts": [ + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 110, + "yStart": 37.166666666666664, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 110, + "dy": 0, + "textString": "setPoiVAV" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.3, + "xStart": 103.25, + "yStart": 51.333333333333336, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 103.25, + "dy": 0, + "textString": "T" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.71, + "xStart": 117.6, + "yStart": 57.29166666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 117.6, + "dy": 0, + "textString": "u" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 42.25, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uHea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 45.25, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.54, + "xStart": 118.1, + "yStart": 44.916666666666664, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.1, + "dy": 0, + "textString": "TSupHeaEco" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.79, + "xStart": 118.1, + "yStart": 49.916666666666664, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.1, + "dy": 0, + "textString": "TSupCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.43, + "xStart": 118.7, + "yStart": 55.08333333333333, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.7, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.7, + "yStart": 51.916666666666664, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.7, + "dy": 0, + "textString": "TZon" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 55.08333333333333, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "TOut" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.3, + "xStart": 103.25, + "yStart": 45.166666666666664, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 103.25, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.79, + "xStart": 101.7, + "yStart": 48.41666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.7, + "dy": 0, + "textString": "TZonSet" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 57.75, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uFan" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 110, + "yStart": 77.16666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 110, + "dy": 0, + "textString": "setPoiVAV1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.3, + "xStart": 103.25, + "yStart": 91.33333333333333, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 103.25, + "dy": 0, + "textString": "T" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.71, + "xStart": 117.6, + "yStart": 97.29166666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 117.6, + "dy": 0, + "textString": "u" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 82.25, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uHea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 85.25, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.54, + "xStart": 118.1, + "yStart": 84.91666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.1, + "dy": 0, + "textString": "TSupHeaEco" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.79, + "xStart": 118.1, + "yStart": 89.91666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.1, + "dy": 0, + "textString": "TSupCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.43, + "xStart": 118.7, + "yStart": 95.08333333333333, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.7, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.7, + "yStart": 91.91666666666666, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.7, + "dy": 0, + "textString": "TZon" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 95.08333333333333, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "TOut" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.3, + "xStart": 103.25, + "yStart": 85.16666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 103.25, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.79, + "xStart": 101.7, + "yStart": 88.41666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.7, + "dy": 0, + "textString": "TZonSet" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 97.75, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uFan" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 110, + "yStart": 117.16666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 110, + "dy": 0, + "textString": "setPoiVAV2" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.3, + "xStart": 103.25, + "yStart": 131.33333333333334, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 103.25, + "dy": 0, + "textString": "T" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.71, + "xStart": 117.6, + "yStart": 137.29166666666666, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 117.6, + "dy": 0, + "textString": "u" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 122.25, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uHea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 125.25, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.54, + "xStart": 118.1, + "yStart": 124.91666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.1, + "dy": 0, + "textString": "TSupHeaEco" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.79, + "xStart": 118.1, + "yStart": 129.91666666666666, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.1, + "dy": 0, + "textString": "TSupCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.43, + "xStart": 118.7, + "yStart": 135.08333333333334, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 118.7, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.7, + "yStart": 131.91666666666666, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.7, + "dy": 0, + "textString": "TZon" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 135.08333333333334, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "TOut" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.3, + "xStart": 103.25, + "yStart": 125.16666666666667, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 103.25, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 0.79, + "xStart": 101.7, + "yStart": 128.41666666666666, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.7, + "dy": 0, + "textString": "TZonSet" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.4, + "xStart": 101.5, + "yStart": 137.75, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 101.5, + "dy": 0, + "textString": "uFan" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 97, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "TZon" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 123, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "k=273.15 + 28" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 46.6, + "yStart": 106.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 46.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 127, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "TOut" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 153, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "k=273.15 + 22" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 46.6, + "yStart": 136.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 46.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 7, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "uHea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 33, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "duration=0.25" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 46.6, + "yStart": 16.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 46.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 37, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "uCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 63, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "duration=0.25" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 46.6, + "yStart": 46.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 46.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 67, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "TZonSet" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 93, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "k=273.15 + 23" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 46.6, + "yStart": 76.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 46.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 157, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "TZon1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 183, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "k=273.15 + 23" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 46.6, + "yStart": 166.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 46.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 30, + "yStart": 187, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "fanSta" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.95, + "xStart": 30, + "yStart": 212.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 30, + "dy": 0, + "textString": "true" + } + ] + } + ] + }, + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nsetPoiVAV\n\n\nT\n\n\nu\n\n\nuHea\n\n\nuCoo\n\n\nTSupHeaEco\n\n\nTSupCoo\n\n\ny\n\n\nTZon\n\n\nTOut\n\n\ny\n\n\nTZonSet\n\n\nuFan\n\n\nsetPoiVAV1\n\n\nT\n\n\nu\n\n\nuHea\n\n\nuCoo\n\n\nTSupHeaEco\n\n\nTSupCoo\n\n\ny\n\n\nTZon\n\n\nTOut\n\n\ny\n\n\nTZonSet\n\n\nuFan\n\n\nsetPoiVAV2\n\n\nT\n\n\nu\n\n\nuHea\n\n\nuCoo\n\n\nTSupHeaEco\n\n\nTSupCoo\n\n\ny\n\n\nTZon\n\n\nTOut\n\n\ny\n\n\nTZonSet\n\n\nuFan\n\n\nTZon\n\n\nk=273.15 + 28\n\n\n\n\n\nTOut\n\n\nk=273.15 + 22\n\n\n\n\n\nuHea\n\n\nduration=0.25\n\n\n\n\n\nuCoo\n\n\nduration=0.25\n\n\n\n\n\nTZonSet\n\n\nk=273.15 + 23\n\n\n\n\n\nTZon1\n\n\nk=273.15 + 23\n\n\n\n\n\nfanSta\n\n\ntrue\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/ASHRAE/G36_PR1/AHUs/SingleZone/VAV/SetPoints/Supply.mo", + "within": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints", + "topClassName": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Supply", + "comment": "Supply air set point for single zone VAV system", + "defaultName": "\"setPoiVAV\"", + "public": { + "parameters": [ + { + "className": "Modelica.SIunits.Temperature", + "type": "Real", + "name": "TSupSetMax", + "comment": "Maximum supply air temperature for heating", + "annotation": { + "dialog": { + "group": "Temperatures", + "tab": "General" + } + } + }, + { + "className": "Modelica.SIunits.Temperature", + "type": "Real", + "name": "TSupSetMin", + "comment": "Minimum supply air temperature for cooling", + "annotation": { + "dialog": { + "group": "Temperatures", + "tab": "General" + } + } + }, + { + "className": "Real", + "type": "Real", + "name": "yHeaMax", + "comment": "Maximum fan speed for heating", + "unit": { + "value": "\"1\"" + }, + "min": { + "value": "0" + }, + "max": { + "value": "1" + }, + "modifications": [ + { + "value": "0", + "isFinal": false + }, + { + "value": "1", + "isFinal": false + }, + { + "value": "\"1\"", + "isFinal": false + } + ], + "annotation": { + "dialog": { + "group": "Speed", + "tab": "General" + } + } + }, + { + "className": "Real", + "type": "Real", + "name": "yMin", + "comment": "Minimum fan speed", + "unit": { + "value": "\"1\"" + }, + "min": { + "value": "0" + }, + "max": { + "value": "1" + }, + "modifications": [ + { + "value": "0", + "isFinal": false + }, + { + "value": "1", + "isFinal": false + }, + { + "value": "\"1\"", + "isFinal": false + } + ], + "annotation": { + "dialog": { + "group": "Speed", + "tab": "General" + } + } + }, + { + "className": "Real", + "type": "Real", + "name": "yCooMax", + "value": "1", + "comment": "Maximum fan speed for cooling", + "unit": { + "value": "\"1\"" + }, + "min": { + "value": "0" + }, + "max": { + "value": "1" + }, + "modifications": [ + { + "value": "0", + "isFinal": false + }, + { + "value": "1", + "isFinal": false + }, + { + "value": "\"1\"", + "isFinal": false + } + ], + "annotation": { + "dialog": { + "group": "Speed", + "tab": "General" + } + } + } + ], + "models": [ + { + "className": "Buildings.Controls.OBC.CDL.Logical.Switch", + "name": "switch", + "comment": "Switch to assign control signal", + "placement": { + "transformation": { + "extent": [ + { + "x": 72, + "y": -30 + }, + { + "x": 92, + "y": -10 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "fanOff", + "comment": "Fan off status", + "modifications": [ + { + "name": "k", + "value": "0", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 40, + "y": -20 + }, + { + "x": 60, + "y": 0 + } + ] + } + } + } + ], + "inputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "uHea", + "comment": "Heating control signal", + "unit": { + "value": "\"1\"" + }, + "min": { + "value": "0" + }, + "max": { + "value": "1" + }, + "modifications": [ + { + "value": "0", + "isFinal": false + }, + { + "value": "1", + "isFinal": false + }, + { + "value": "\"1\"", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": 90 + }, + { + "x": -100, + "y": 130 + } + ] + }, + "iconTransformation": { + "extent": [ + { + "x": -140, + "y": 80 + }, + { + "x": -100, + "y": 120 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "uCoo", + "comment": "Cooling control signal", + "unit": { + "value": "\"1\"" + }, + "min": { + "value": "0" + }, + "max": { + "value": "1" + }, + "modifications": [ + { + "value": "0", + "isFinal": false + }, + { + "value": "1", + "isFinal": false + }, + { + "value": "\"1\"", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": 50 + }, + { + "x": -100, + "y": 90 + } + ] + }, + "iconTransformation": { + "extent": [ + { + "x": -140, + "y": 40 + }, + { + "x": -100, + "y": 80 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "TZonSet", + "comment": "Average of heating and cooling setpoints for zone temperature", + "unit": { + "value": "\"K\"" + }, + "displayUnit": { + "value": "\"degC\"" + }, + "modifications": [ + { + "value": "\"K\"", + "isFinal": false + }, + { + "value": "\"degC\"", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": 10 + }, + { + "x": -100, + "y": 50 + } + ] + }, + "iconTransformation": { + "extent": [ + { + "x": -140, + "y": 0 + }, + { + "x": -100, + "y": 40 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "TZon", + "comment": "Zone temperature", + "unit": { + "value": "\"K\"" + }, + "displayUnit": { + "value": "\"degC\"" + }, + "modifications": [ + { + "value": "\"K\"", + "isFinal": false + }, + { + "value": "\"degC\"", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -30 + }, + { + "x": -100, + "y": 10 + } + ] + }, + "iconTransformation": { + "extent": [ + { + "x": -140, + "y": -40 + }, + { + "x": -100, + "y": 0 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "TOut", + "comment": "Outdoor air temperature", + "unit": { + "value": "\"K\"" + }, + "displayUnit": { + "value": "\"degC\"" + }, + "modifications": [ + { + "value": "\"K\"", + "isFinal": false + }, + { + "value": "\"degC\"", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -100 + }, + { + "x": -100, + "y": -60 + } + ] + }, + "iconTransformation": { + "extent": [ + { + "x": -140, + "y": -80 + }, + { + "x": -100, + "y": -40 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.BooleanInput", + "name": "uFan", + "comment": "Supply fan status", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -160 + }, + { + "x": -100, + "y": -120 + } + ] + }, + "iconTransformation": { + "extent": [ + { + "x": -140, + "y": -120 + }, + { + "x": -100, + "y": -80 + } + ] + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "TSupHeaEco", + "comment": "Temperature setpoint for heating coil and for economizer", + "unit": { + "value": "\"K\"" + }, + "displayUnit": { + "value": "\"degC\"" + }, + "modifications": [ + { + "value": "\"K\"", + "isFinal": false + }, + { + "value": "\"degC\"", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": 80 + }, + { + "x": 140, + "y": 120 + } + ] + }, + "iconTransformation": { + "extent": [ + { + "x": 100, + "y": 40 + }, + { + "x": 140, + "y": 80 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "TSupCoo", + "comment": "Cooling supply air temperature setpoint", + "unit": { + "value": "\"K\"" + }, + "displayUnit": { + "value": "\"degC\"" + }, + "modifications": [ + { + "value": "\"K\"", + "isFinal": false + }, + { + "value": "\"degC\"", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": 20 + }, + { + "x": 140, + "y": 60 + } + ] + }, + "iconTransformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "y", + "comment": "Fan speed", + "unit": { + "value": "\"1\"" + }, + "min": { + "value": "0" + }, + "max": { + "value": "1" + }, + "modifications": [ + { + "value": "0", + "isFinal": false + }, + { + "value": "1", + "isFinal": false + }, + { + "value": "\"1\"", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -80 + }, + { + "x": 140, + "y": -40 + } + ] + } + } + } + ] + }, + "protected": { + "models": [ + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Line", + "name": "TSetCooHig", + "comment": "Table to compute the setpoint for cooling for uCoo = 0...1", + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": 130 + }, + { + "x": 20, + "y": 150 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Line", + "name": "offSetTSetHea", + "comment": "Table to compute the setpoint offset for heating for uCoo = 0...1", + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": 170 + }, + { + "x": 20, + "y": 190 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Add", + "name": "addTHe", + "comment": "Adder for heating setpoint calculation", + "placement": { + "transformation": { + "extent": [ + { + "x": 60, + "y": 190 + }, + { + "x": 80, + "y": 210 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Line", + "name": "offSetTSetCoo", + "comment": "Table to compute the setpoint offset for cooling for uHea = 0...1", + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": 90 + }, + { + "x": 20, + "y": 110 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Add", + "name": "addTSupCoo", + "comment": "Adder for cooling setpoint calculation", + "placement": { + "transformation": { + "extent": [ + { + "x": 60, + "y": 110 + }, + { + "x": 80, + "y": 130 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Add", + "name": "dT", + "comment": "Difference zone minus outdoor temperature", + "modifications": [ + { + "name": "k2", + "value": "-1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -70, + "y": -128 + }, + { + "x": -50, + "y": -108 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.AddParameter", + "name": "yMed", + "comment": "Fan speed at medium cooling load", + "modifications": [ + { + "name": "p", + "value": "yCooMax - (yMin - yCooMax)/(0.56 - 5.6)*5.6", + "isFinal": true + }, + { + "name": "k", + "value": "(yMin - yCooMax)/(0.56 - 5.6)", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -30, + "y": -128 + }, + { + "x": -10, + "y": -108 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Limiter", + "name": "yMedLim", + "comment": "Limiter for yMed", + "modifications": [ + { + "name": "uMax", + "value": "yCooMax", + "isFinal": true + }, + { + "name": "uMin", + "value": "yMin", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": -128 + }, + { + "x": 20, + "y": -108 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Limiter", + "name": "TDea", + "comment": "Limiter that outputs the dead band value for the supply air temperature", + "modifications": [ + { + "name": "uMax", + "value": "24 + 273.15", + "isFinal": true + }, + { + "name": "uMin", + "value": "21 + 273.15", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 20 + }, + { + "x": -60, + "y": 40 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Line", + "name": "TSetHeaHig", + "comment": "Block to compute the setpoint for heating for uHea = 0...1", + "placement": { + "transformation": { + "extent": [ + { + "x": 2, + "y": 210 + }, + { + "x": 22, + "y": 230 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con0", + "comment": "Contant that outputs zero", + "modifications": [ + { + "name": "k", + "value": "0", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 210 + }, + { + "x": -60, + "y": 230 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con25", + "comment": "Contant that outputs 0.25", + "modifications": [ + { + "name": "k", + "value": "0.25", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 170 + }, + { + "x": -60, + "y": 190 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con05", + "comment": "Contant that outputs 0.5", + "modifications": [ + { + "name": "k", + "value": "0.5", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 140 + }, + { + "x": -60, + "y": 160 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con75", + "comment": "Contant that outputs 0.75", + "modifications": [ + { + "name": "k", + "value": "0.75", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 110 + }, + { + "x": -60, + "y": 130 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "conTSupSetMax", + "comment": "Constant that outputs TSupSetMax", + "modifications": [ + { + "name": "k", + "value": "TSupSetMax", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": 50 + }, + { + "x": -60, + "y": 70 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "conTSupSetMin", + "comment": "Constant that outputs TSupSetMin", + "modifications": [ + { + "name": "k", + "value": "TSupSetMin", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -10 + }, + { + "x": -60, + "y": 10 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Add", + "name": "TDeaTSupSetMin", + "comment": "Outputs TDea-TSupSetMin", + "modifications": [ + { + "name": "k2", + "value": "-1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -20, + "y": 0 + }, + { + "x": 0, + "y": 20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.AddParameter", + "name": "addTDea", + "comment": "Adds constant offset", + "modifications": [ + { + "name": "p", + "value": "-1.1", + "isFinal": true + }, + { + "name": "k", + "value": "-1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 10, + "y": 0 + }, + { + "x": 30, + "y": 20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Add", + "name": "TSupSetMaxTDea", + "comment": "Outputs TSupSetMax-TDea", + "modifications": [ + { + "name": "k2", + "value": "-1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -20, + "y": 40 + }, + { + "x": 0, + "y": 60 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Line", + "name": "yHea", + "comment": "Fan speed for heating", + "placement": { + "transformation": { + "extent": [ + { + "x": 4, + "y": -60 + }, + { + "x": 24, + "y": -40 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Line", + "name": "lin050", + "comment": "Linear increase in control signal for 0 < yCoo < 0.75", + "modifications": [ + { + "name": "limitBelow", + "value": "true", + "isFinal": true + }, + { + "name": "limitAbove", + "value": "true", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -20, + "y": -202 + }, + { + "x": 0, + "y": -182 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con025", + "comment": "Constant signal", + "modifications": [ + { + "name": "k", + "value": "0.25", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -176 + }, + { + "x": -60, + "y": -156 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con1", + "comment": "Constant signal", + "modifications": [ + { + "name": "k", + "value": "0.5", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -232 + }, + { + "x": -60, + "y": -212 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con2", + "comment": "Constant signal", + "modifications": [ + { + "name": "k", + "value": "1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": -320 + }, + { + "x": 20, + "y": -300 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con3", + "comment": "Constant signal", + "modifications": [ + { + "name": "k", + "value": "0", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -206 + }, + { + "x": -60, + "y": -186 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con4", + "comment": "Constant signal", + "modifications": [ + { + "name": "k", + "value": "yCooMax - yMin", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -76, + "y": -288 + }, + { + "x": -56, + "y": -268 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Add", + "name": "dY075", + "comment": "Change in control signal above yMedLim for y > 0.75", + "modifications": [ + { + "name": "k2", + "value": "-1", + "isFinal": true + }, + { + "name": "k1", + "value": "1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -36, + "y": -294 + }, + { + "x": -16, + "y": -274 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Line", + "name": "lin075", + "comment": "Linear increase in control signal for 0.75 < yCoo", + "modifications": [ + { + "name": "limitBelow", + "value": "true", + "isFinal": true + }, + { + "name": "limitAbove", + "value": "true", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 34, + "y": -294 + }, + { + "x": 54, + "y": -274 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con5", + "comment": "Constant signal", + "modifications": [ + { + "name": "k", + "value": "0.75", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": -286 + }, + { + "x": 20, + "y": -266 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con6", + "comment": "Constant signal", + "modifications": [ + { + "name": "k", + "value": "0", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 0, + "y": -350 + }, + { + "x": 20, + "y": -330 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.AddParameter", + "name": "yOffSet", + "comment": "Subtract yMin so that all control signals can be added", + "modifications": [ + { + "name": "p", + "value": "-yMin", + "isFinal": true + }, + { + "name": "k", + "value": "1", + "isFinal": false + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 36, + "y": -128 + }, + { + "x": 56, + "y": -108 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Add", + "name": "addHeaCoo", + "comment": "Add heating control signal and offset due to cooling", + "modifications": [ + { + "name": "k1", + "value": "1", + "isFinal": true + }, + { + "name": "k2", + "value": "1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 40, + "y": -66 + }, + { + "x": 60, + "y": -46 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Add", + "name": "offCoo", + "comment": "Offset of control signal (relative to heating signal) for cooling", + "modifications": [ + { + "name": "k1", + "value": "1", + "isFinal": true + }, + { + "name": "k2", + "value": "1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": 40, + "y": -202 + }, + { + "x": 60, + "y": -182 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "con7", + "comment": "Contant that outputs 0.5", + "modifications": [ + { + "name": "k", + "value": "0.5", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -40, + "y": -40 + }, + { + "x": -20, + "y": -20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "minSpe", + "comment": "Contant that outputs minimum fan speed", + "modifications": [ + { + "name": "k", + "value": "yMin", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -40 + }, + { + "x": -60, + "y": -20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "conOne", + "comment": "Contant that outputs 1", + "modifications": [ + { + "name": "k", + "value": "1", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -80, + "y": -80 + }, + { + "x": -60, + "y": -60 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "name": "maxHeaSpe", + "comment": "Contant that outputs maximum fan speed for heating", + "modifications": [ + { + "name": "k", + "value": "yHeaMax", + "isFinal": true + } + ], + "placement": { + "transformation": { + "extent": [ + { + "x": -40, + "y": -80 + }, + { + "x": -20, + "y": -60 + } + ] + } + } + } + ] + }, + "info": "\n

\nBlock that outputs the set points for the supply air temperature for\ncooling, heating and economizer control,\nand the fan speed for a single zone VAV system.\n

\n

\nFor the temperature set points, the\nparameters are the maximum supply air temperature TSupSetMax,\nand the minimum supply air temperature for cooling TSupSetMin.\nThe deadband temperature is equal to the\naverage set point for the zone temperature\nfor heating and cooling, as obtained from the input TZonSet,\nconstraint to be within 21°C (≈70 F) and\n24°C (≈75 F).\nThe setpoints are computed as shown in the figure below.\nNote that the setpoint for the supply air temperature for heating\nand for economizer control is the same, and this setpoint is\nlower than TSupSetMin when the heating loop signal\nis zero and the economizer is in cooling mode, as shown in the figure.\n

\n

\nFor the fan speed set point, the\nparameters are the maximu fan speed at heating yHeaMax,\nthe minimum fan speed yMin and\nthe maximum fan speed for cooling yCooMax.\nFor a cooling control signal of uCoo > 0.25,\nthe speed is faster increased the larger the difference is between\nthe zone temperature minus outdoor temperature TZon-TOut.\nThe figure below shows the sequence.\n

\n

\n\"Image\n

\n

\nThe output TSupCoo is to be used to control the cooling coil,\nand the output\nTSupHeaEco is to be used to control the heating coil and the\neconomizer dampers.\n

\n

\nNote that the inputs uHea and uCoo must be computed\nbased on the same temperature sensors and control loops.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -120 + }, + { + "x": 100, + "y": 120 + } + ], + "preserveAspectRatio": false, + "initialScale": 0.1 + }, + "graphics": { + "line": [ + { + "points": [ + { + "x": 8, + "y": -76 + }, + { + "x": 78, + "y": -76 + } + ], + "color": { + "r": 95, + "g": 95, + "b": 95 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -54, + "y": -22 + }, + { + "x": -54, + "y": -62 + } + ], + "color": { + "r": 95, + "g": 95, + "b": 95 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -44, + "y": -6 + }, + { + "x": -30, + "y": -6 + }, + { + "x": -14, + "y": -42 + }, + { + "x": 26, + "y": -42 + }, + { + "x": 38, + "y": -62 + }, + { + "x": 60, + "y": -62 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 255 + }, + "thickness": 0.5, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid" + }, + { + "points": [ + { + "x": -44, + "y": -6 + }, + { + "x": -30, + "y": -6 + }, + { + "x": -14, + "y": -42 + }, + { + "x": 2, + "y": -42 + }, + { + "x": 18, + "y": -66 + }, + { + "x": 60, + "y": -66 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Dot", + "thickness": 0.5, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0 + }, + { + "points": [ + { + "x": -4, + "y": -76 + }, + { + "x": -60, + "y": -76 + } + ], + "color": { + "r": 95, + "g": 95, + "b": 95 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -54, + "y": 50 + }, + { + "x": -54, + "y": 10 + } + ], + "color": { + "r": 95, + "g": 95, + "b": 95 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -46, + "y": 44 + }, + { + "x": -28, + "y": 20 + }, + { + "x": 18, + "y": 20 + }, + { + "x": 28, + "y": 36 + }, + { + "x": 38, + "y": 36 + }, + { + "x": 50, + "y": 54 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": 18, + "y": 20 + }, + { + "x": 38, + "y": 20 + }, + { + "x": 50, + "y": 54 + }, + { + "x": 28, + "y": 54 + }, + { + "x": 18, + "y": 20 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + "polygon": [ + { + "lineColor": { + "r": 95, + "g": 95, + "b": 95 + }, + "fillColor": { + "r": 95, + "g": 95, + "b": 95 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 80, + "y": -76 + }, + { + "x": 58, + "y": -70 + }, + { + "x": 58, + "y": -82 + }, + { + "x": 80, + "y": -76 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + }, + { + "lineColor": { + "r": 95, + "g": 95, + "b": 95 + }, + "fillColor": { + "r": 95, + "g": 95, + "b": 95 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -54, + "y": 0 + }, + { + "x": -60, + "y": -22 + }, + { + "x": -48, + "y": -22 + }, + { + "x": -54, + "y": 0 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + }, + { + "lineColor": { + "r": 95, + "g": 95, + "b": 95 + }, + "fillColor": { + "r": 95, + "g": 95, + "b": 95 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -64, + "y": -76 + }, + { + "x": -42, + "y": -70 + }, + { + "x": -42, + "y": -82 + }, + { + "x": -64, + "y": -76 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + }, + { + "lineColor": { + "r": 95, + "g": 95, + "b": 95 + }, + "fillColor": { + "r": 95, + "g": 95, + "b": 95 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -54, + "y": 72 + }, + { + "x": -60, + "y": 50 + }, + { + "x": -48, + "y": 50 + }, + { + "x": -54, + "y": 72 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + } + ], + "rectangle": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -100, + "y": -120 + }, + { + "x": 100, + "y": 120 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 174 + }, + { + "x": 150, + "y": 134 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": -88, + "y": -6 + }, + { + "x": -47, + "y": -26 + } + ], + "textString": "\"T\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": 64, + "y": -82 + }, + { + "x": 88, + "y": -93 + } + ], + "textString": "\"u\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -98, + "y": 104 + }, + { + "x": -72, + "y": 82 + } + ], + "textString": "\"uHea\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -98, + "y": 68 + }, + { + "x": -72, + "y": 46 + } + ], + "textString": "\"uCoo\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 68, + "y": 72 + }, + { + "x": 94, + "y": 50 + } + ], + "textString": "\"TSupHeaEco\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 68, + "y": 12 + }, + { + "x": 94, + "y": -10 + } + ], + "textString": "\"TSupCoo\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 74, + "y": -50 + }, + { + "x": 100, + "y": -72 + } + ], + "textString": "\"y\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -96, + "y": -12 + }, + { + "x": -70, + "y": -34 + } + ], + "textString": "\"TZon\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -98, + "y": -50 + }, + { + "x": -72, + "y": -72 + } + ], + "textString": "\"TOut\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": -88, + "y": 68 + }, + { + "x": -47, + "y": 48 + } + ], + "textString": "\"y\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -96, + "y": 30 + }, + { + "x": -70, + "y": 8 + } + ], + "textString": "\"TZonSet\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -98, + "y": -82 + }, + { + "x": -72, + "y": -104 + } + ], + "textString": "\"uFan\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "diagram": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -380 + }, + { + "x": 100, + "y": 240 + } + ], + "preserveAspectRatio": false, + "initialScale": 0.1 + }, + "graphics": { + "rectangle": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -82, + "y": -152 + }, + { + "x": 84, + "y": -248 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -84, + "y": -100 + }, + { + "x": 80, + "y": -138 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -84, + "y": -16 + }, + { + "x": 26, + "y": -86 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -82, + "y": -256 + }, + { + "x": 84, + "y": -356 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 46, + "y": -252 + }, + { + "x": 82, + "y": -234 + } + ], + "textString": "\"0.25 < yCoo < 0.5\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 46, + "y": -316 + }, + { + "x": 82, + "y": -298 + } + ], + "textString": "\"0.75 < yCoo < 1\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 28, + "y": -142 + }, + { + "x": 64, + "y": -124 + } + ], + "textString": "\"0.5 < yCoo < 0.75\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -16, + "y": -78 + }, + { + "x": 14, + "y": -72 + } + ], + "textString": "\"heating\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 215, + "g": 215, + "b": 215 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -82, + "y": -98 + }, + { + "x": 88, + "y": -90 + } + ], + "textString": "\"For cooling, compute the change relative to yMin, and then add the heating and\ncooling control signals to output yFan\"", + "horizontalAlignment": "TextAlignment.Left", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + } + } + ] + } + }, + "connections": [ + [ + { + "instance": "offSetTSetHea", + "connector": "u" + }, + { + "instance": "uCoo" + }, + { + "points": [ + { + "x": -2, + "y": 180 + }, + { + "x": -32, + "y": 180 + }, + { + "x": -32, + "y": 82 + }, + { + "x": -94, + "y": 82 + }, + { + "x": -94, + "y": 70 + }, + { + "x": -120, + "y": 70 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offSetTSetHea", + "connector": "y" + }, + { + "instance": "addTHe", + "connector": "u2" + }, + { + "points": [ + { + "x": 22, + "y": 180 + }, + { + "x": 40, + "y": 180 + }, + { + "x": 40, + "y": 194 + }, + { + "x": 58, + "y": 194 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "addTHe", + "connector": "y" + }, + { + "instance": "TSupHeaEco" + }, + { + "points": [ + { + "x": 82, + "y": 200 + }, + { + "x": 92, + "y": 200 + }, + { + "x": 92, + "y": 100 + }, + { + "x": 120, + "y": 100 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSetCooHig", + "connector": "y" + }, + { + "instance": "addTSupCoo", + "connector": "u1" + }, + { + "points": [ + { + "x": 22, + "y": 140 + }, + { + "x": 40, + "y": 140 + }, + { + "x": 40, + "y": 126 + }, + { + "x": 58, + "y": 126 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offSetTSetCoo", + "connector": "y" + }, + { + "instance": "addTSupCoo", + "connector": "u2" + }, + { + "points": [ + { + "x": 22, + "y": 100 + }, + { + "x": 40, + "y": 100 + }, + { + "x": 40, + "y": 114 + }, + { + "x": 58, + "y": 114 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSetCooHig", + "connector": "u" + }, + { + "instance": "uCoo" + }, + { + "points": [ + { + "x": -2, + "y": 140 + }, + { + "x": -32, + "y": 140 + }, + { + "x": -32, + "y": 82 + }, + { + "x": -94, + "y": 82 + }, + { + "x": -94, + "y": 70 + }, + { + "x": -120, + "y": 70 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offSetTSetCoo", + "connector": "u" + }, + { + "instance": "uHea" + }, + { + "points": [ + { + "x": -2, + "y": 100 + }, + { + "x": -88, + "y": 100 + }, + { + "x": -88, + "y": 110 + }, + { + "x": -120, + "y": 110 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "addTSupCoo", + "connector": "y" + }, + { + "instance": "TSupCoo" + }, + { + "points": [ + { + "x": 82, + "y": 120 + }, + { + "x": 84, + "y": 120 + }, + { + "x": 84, + "y": 40 + }, + { + "x": 120, + "y": 40 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "dT", + "connector": "u1" + }, + { + "instance": "TZon" + }, + { + "points": [ + { + "x": -72, + "y": -112 + }, + { + "x": -86, + "y": -112 + }, + { + "x": -86, + "y": -10 + }, + { + "x": -120, + "y": -10 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "dT", + "connector": "u2" + }, + { + "instance": "TOut" + }, + { + "points": [ + { + "x": -72, + "y": -124 + }, + { + "x": -88, + "y": -124 + }, + { + "x": -88, + "y": -80 + }, + { + "x": -120, + "y": -80 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "dT", + "connector": "y" + }, + { + "instance": "yMed", + "connector": "u" + }, + { + "points": [ + { + "x": -48, + "y": -118 + }, + { + "x": -32, + "y": -118 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "yMedLim", + "connector": "u" + }, + { + "instance": "yMed", + "connector": "y" + }, + { + "points": [ + { + "x": -2, + "y": -118 + }, + { + "x": -8, + "y": -118 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TDea", + "connector": "u" + }, + { + "instance": "TZonSet" + }, + { + "points": [ + { + "x": -82, + "y": 30 + }, + { + "x": -120, + "y": 30 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TDea", + "connector": "y" + }, + { + "instance": "TSetHeaHig", + "connector": "f1" + }, + { + "points": [ + { + "x": -58, + "y": 30 + }, + { + "x": -52, + "y": 30 + }, + { + "x": -52, + "y": 224 + }, + { + "x": 0, + "y": 224 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "con05", + "connector": "y" + }, + { + "instance": "TSetHeaHig", + "connector": "x2" + }, + { + "points": [ + { + "x": -58, + "y": 150 + }, + { + "x": -46, + "y": 150 + }, + { + "x": -46, + "y": 216 + }, + { + "x": 0, + "y": 216 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "conTSupSetMax", + "connector": "y" + }, + { + "instance": "TSetHeaHig", + "connector": "f2" + }, + { + "points": [ + { + "x": -58, + "y": 60 + }, + { + "x": -40, + "y": 60 + }, + { + "x": -40, + "y": 212 + }, + { + "x": 0, + "y": 212 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uHea" + }, + { + "instance": "TSetHeaHig", + "connector": "u" + }, + { + "points": [ + { + "x": -120, + "y": 110 + }, + { + "x": -88, + "y": 110 + }, + { + "x": -88, + "y": 102 + }, + { + "x": -36, + "y": 102 + }, + { + "x": -36, + "y": 220 + }, + { + "x": 0, + "y": 220 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSetHeaHig", + "connector": "y" + }, + { + "instance": "addTHe", + "connector": "u1" + }, + { + "points": [ + { + "x": 24, + "y": 220 + }, + { + "x": 40, + "y": 220 + }, + { + "x": 40, + "y": 206 + }, + { + "x": 58, + "y": 206 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "con0", + "connector": "y" + }, + { + "instance": "offSetTSetHea", + "connector": "x1" + }, + { + "points": [ + { + "x": -58, + "y": 220 + }, + { + "x": -56, + "y": 220 + }, + { + "x": -56, + "y": 188 + }, + { + "x": -2, + "y": 188 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "con25", + "connector": "y" + }, + { + "instance": "offSetTSetHea", + "connector": "x2" + }, + { + "points": [ + { + "x": -58, + "y": 180 + }, + { + "x": -34, + "y": 180 + }, + { + "x": -34, + "y": 176 + }, + { + "x": -2, + "y": 176 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "con0", + "connector": "y" + }, + { + "instance": "offSetTSetHea", + "connector": "f1" + }, + { + "points": [ + { + "x": -58, + "y": 220 + }, + { + "x": -56, + "y": 220 + }, + { + "x": -56, + "y": 184 + }, + { + "x": -2, + "y": 184 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TDea", + "connector": "y" + }, + { + "instance": "TDeaTSupSetMin", + "connector": "u1" + }, + { + "points": [ + { + "x": -58, + "y": 30 + }, + { + "x": -40, + "y": 30 + }, + { + "x": -40, + "y": 16 + }, + { + "x": -22, + "y": 16 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "conTSupSetMin", + "connector": "y" + }, + { + "instance": "TDeaTSupSetMin", + "connector": "u2" + }, + { + "points": [ + { + "x": -58, + "y": 0 + }, + { + "x": -40, + "y": 0 + }, + { + "x": -40, + "y": 4 + }, + { + "x": -22, + "y": 4 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TDeaTSupSetMin", + "connector": "y" + }, + { + "instance": "addTDea", + "connector": "u" + }, + { + "points": [ + { + "x": 2, + "y": 10 + }, + { + "x": 8, + "y": 10 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "addTDea", + "connector": "y" + }, + { + "instance": "offSetTSetHea", + "connector": "f2" + }, + { + "points": [ + { + "x": 32, + "y": 10 + }, + { + "x": 34, + "y": 10 + }, + { + "x": 34, + "y": 70 + }, + { + "x": -14, + "y": 70 + }, + { + "x": -14, + "y": 172 + }, + { + "x": -2, + "y": 172 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSetCooHig", + "connector": "x1" + }, + { + "instance": "con05", + "connector": "y" + }, + { + "points": [ + { + "x": -2, + "y": 148 + }, + { + "x": -30, + "y": 148 + }, + { + "x": -30, + "y": 150 + }, + { + "x": -58, + "y": 150 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSetCooHig", + "connector": "f1" + }, + { + "instance": "TDea", + "connector": "y" + }, + { + "points": [ + { + "x": -2, + "y": 144 + }, + { + "x": -52, + "y": 144 + }, + { + "x": -52, + "y": 30 + }, + { + "x": -58, + "y": 30 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSetCooHig", + "connector": "x2" + }, + { + "instance": "con75", + "connector": "y" + }, + { + "points": [ + { + "x": -2, + "y": 136 + }, + { + "x": -44, + "y": 136 + }, + { + "x": -44, + "y": 120 + }, + { + "x": -58, + "y": 120 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSetCooHig", + "connector": "f2" + }, + { + "instance": "conTSupSetMin", + "connector": "y" + }, + { + "points": [ + { + "x": -2, + "y": 132 + }, + { + "x": -50, + "y": 132 + }, + { + "x": -50, + "y": 0 + }, + { + "x": -58, + "y": 0 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offSetTSetCoo", + "connector": "f1" + }, + { + "instance": "con0", + "connector": "y" + }, + { + "points": [ + { + "x": -2, + "y": 104 + }, + { + "x": -56, + "y": 104 + }, + { + "x": -56, + "y": 220 + }, + { + "x": -58, + "y": 220 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offSetTSetCoo", + "connector": "x1" + }, + { + "instance": "con0", + "connector": "y" + }, + { + "points": [ + { + "x": -2, + "y": 108 + }, + { + "x": -56, + "y": 108 + }, + { + "x": -56, + "y": 220 + }, + { + "x": -58, + "y": 220 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offSetTSetCoo", + "connector": "x2" + }, + { + "instance": "con05", + "connector": "y" + }, + { + "points": [ + { + "x": -2, + "y": 96 + }, + { + "x": -46, + "y": 96 + }, + { + "x": -46, + "y": 150 + }, + { + "x": -58, + "y": 150 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSupSetMaxTDea", + "connector": "u1" + }, + { + "instance": "conTSupSetMax", + "connector": "y" + }, + { + "points": [ + { + "x": -22, + "y": 56 + }, + { + "x": -40, + "y": 56 + }, + { + "x": -40, + "y": 60 + }, + { + "x": -58, + "y": 60 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TDea", + "connector": "y" + }, + { + "instance": "TSupSetMaxTDea", + "connector": "u2" + }, + { + "points": [ + { + "x": -58, + "y": 30 + }, + { + "x": -40, + "y": 30 + }, + { + "x": -40, + "y": 44 + }, + { + "x": -22, + "y": 44 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSupSetMaxTDea", + "connector": "y" + }, + { + "instance": "offSetTSetCoo", + "connector": "f2" + }, + { + "points": [ + { + "x": 2, + "y": 50 + }, + { + "x": 10, + "y": 50 + }, + { + "x": 10, + "y": 80 + }, + { + "x": -10, + "y": 80 + }, + { + "x": -10, + "y": 92 + }, + { + "x": -2, + "y": 92 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uCoo" + }, + { + "instance": "lin050", + "connector": "u" + }, + { + "points": [ + { + "x": -120, + "y": 70 + }, + { + "x": -94, + "y": 70 + }, + { + "x": -94, + "y": -146 + }, + { + "x": -38, + "y": -146 + }, + { + "x": -38, + "y": -192 + }, + { + "x": -22, + "y": -192 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "dY075", + "connector": "u1" + }, + { + "instance": "con4", + "connector": "y" + }, + { + "points": [ + { + "x": -38, + "y": -278 + }, + { + "x": -54, + "y": -278 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "lin075", + "connector": "x2" + }, + { + "instance": "con2", + "connector": "y" + }, + { + "points": [ + { + "x": 32, + "y": -288 + }, + { + "x": 24, + "y": -288 + }, + { + "x": 24, + "y": -310 + }, + { + "x": 22, + "y": -310 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "lin075", + "connector": "x1" + }, + { + "instance": "con5", + "connector": "y" + }, + { + "points": [ + { + "x": 32, + "y": -276 + }, + { + "x": 22, + "y": -276 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uCoo" + }, + { + "instance": "lin075", + "connector": "u" + }, + { + "points": [ + { + "x": -120, + "y": 70 + }, + { + "x": -90, + "y": 70 + }, + { + "x": -90, + "y": -252 + }, + { + "x": 24, + "y": -252 + }, + { + "x": 24, + "y": -284 + }, + { + "x": 32, + "y": -284 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "yMedLim", + "connector": "y" + }, + { + "instance": "yOffSet", + "connector": "u" + }, + { + "points": [ + { + "x": 22, + "y": -118 + }, + { + "x": 34, + "y": -118 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "dY075", + "connector": "u2" + }, + { + "instance": "yOffSet", + "connector": "y" + }, + { + "points": [ + { + "x": -38, + "y": -290 + }, + { + "x": -42, + "y": -290 + }, + { + "x": -42, + "y": -160 + }, + { + "x": 70, + "y": -160 + }, + { + "x": 70, + "y": -118 + }, + { + "x": 58, + "y": -118 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offCoo", + "connector": "u1" + }, + { + "instance": "lin050", + "connector": "y" + }, + { + "points": [ + { + "x": 38, + "y": -186 + }, + { + "x": 20, + "y": -186 + }, + { + "x": 20, + "y": -192 + }, + { + "x": 2, + "y": -192 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offCoo", + "connector": "u2" + }, + { + "instance": "lin075", + "connector": "y" + }, + { + "points": [ + { + "x": 38, + "y": -198 + }, + { + "x": 34, + "y": -198 + }, + { + "x": 34, + "y": -256 + }, + { + "x": 60, + "y": -256 + }, + { + "x": 60, + "y": -284 + }, + { + "x": 56, + "y": -284 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "offCoo", + "connector": "y" + }, + { + "instance": "addHeaCoo", + "connector": "u2" + }, + { + "points": [ + { + "x": 62, + "y": -192 + }, + { + "x": 90, + "y": -192 + }, + { + "x": 90, + "y": -80 + }, + { + "x": 30, + "y": -80 + }, + { + "x": 30, + "y": -62 + }, + { + "x": 38, + "y": -62 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "lin050", + "connector": "x2" + }, + { + "instance": "con1", + "connector": "y" + }, + { + "points": [ + { + "x": -22, + "y": -196 + }, + { + "x": -46, + "y": -196 + }, + { + "x": -46, + "y": -222 + }, + { + "x": -58, + "y": -222 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "con025", + "connector": "y" + }, + { + "instance": "lin050", + "connector": "x1" + }, + { + "points": [ + { + "x": -58, + "y": -166 + }, + { + "x": -52, + "y": -166 + }, + { + "x": -52, + "y": -184 + }, + { + "x": -22, + "y": -184 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "lin050", + "connector": "f2" + }, + { + "instance": "yOffSet", + "connector": "y" + }, + { + "points": [ + { + "x": -22, + "y": -200 + }, + { + "x": -42, + "y": -200 + }, + { + "x": -42, + "y": -160 + }, + { + "x": 70, + "y": -160 + }, + { + "x": 70, + "y": -118 + }, + { + "x": 58, + "y": -118 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "con3", + "connector": "y" + }, + { + "instance": "lin050", + "connector": "f1" + }, + { + "points": [ + { + "x": -58, + "y": -196 + }, + { + "x": -50, + "y": -196 + }, + { + "x": -50, + "y": -188 + }, + { + "x": -22, + "y": -188 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "dY075", + "connector": "y" + }, + { + "instance": "lin075", + "connector": "f2" + }, + { + "points": [ + { + "x": -14, + "y": -284 + }, + { + "x": -8, + "y": -284 + }, + { + "x": -8, + "y": -292 + }, + { + "x": 32, + "y": -292 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "con6", + "connector": "y" + }, + { + "instance": "lin075", + "connector": "f1" + }, + { + "points": [ + { + "x": 22, + "y": -340 + }, + { + "x": 24, + "y": -340 + }, + { + "x": 24, + "y": -280 + }, + { + "x": 32, + "y": -280 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "TSetHeaHig", + "connector": "x1" + }, + { + "instance": "con0", + "connector": "y" + }, + { + "points": [ + { + "x": 0, + "y": 228 + }, + { + "x": -56, + "y": 228 + }, + { + "x": -56, + "y": 220 + }, + { + "x": -58, + "y": 220 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "con7", + "connector": "y" + }, + { + "instance": "yHea", + "connector": "x1" + }, + { + "points": [ + { + "x": -18, + "y": -30 + }, + { + "x": -6, + "y": -30 + }, + { + "x": -6, + "y": -42 + }, + { + "x": 2, + "y": -42 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "minSpe", + "connector": "y" + }, + { + "instance": "yHea", + "connector": "f1" + }, + { + "points": [ + { + "x": -58, + "y": -30 + }, + { + "x": -56, + "y": -30 + }, + { + "x": -56, + "y": -46 + }, + { + "x": 2, + "y": -46 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uHea" + }, + { + "instance": "yHea", + "connector": "u" + }, + { + "points": [ + { + "x": -120, + "y": 110 + }, + { + "x": -94, + "y": 110 + }, + { + "x": -94, + "y": -50 + }, + { + "x": 2, + "y": -50 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "conOne", + "connector": "y" + }, + { + "instance": "yHea", + "connector": "x2" + }, + { + "points": [ + { + "x": -58, + "y": -70 + }, + { + "x": -56, + "y": -70 + }, + { + "x": -56, + "y": -54 + }, + { + "x": 2, + "y": -54 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "maxHeaSpe", + "connector": "y" + }, + { + "instance": "yHea", + "connector": "f2" + }, + { + "points": [ + { + "x": -18, + "y": -70 + }, + { + "x": -6, + "y": -70 + }, + { + "x": -6, + "y": -58 + }, + { + "x": 2, + "y": -58 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "yHea", + "connector": "y" + }, + { + "instance": "addHeaCoo", + "connector": "u1" + }, + { + "points": [ + { + "x": 26, + "y": -50 + }, + { + "x": 38, + "y": -50 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "uFan" + }, + { + "instance": "switch", + "connector": "u2" + }, + { + "points": [ + { + "x": -120, + "y": -140 + }, + { + "x": 84, + "y": -140 + }, + { + "x": 84, + "y": -42 + }, + { + "x": 68, + "y": -42 + }, + { + "x": 68, + "y": -20 + }, + { + "x": 70, + "y": -20 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 255 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "addHeaCoo", + "connector": "y" + }, + { + "instance": "switch", + "connector": "u1" + }, + { + "points": [ + { + "x": 62, + "y": -56 + }, + { + "x": 64, + "y": -56 + }, + { + "x": 64, + "y": -12 + }, + { + "x": 70, + "y": -12 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "fanOff", + "connector": "y" + }, + { + "instance": "switch", + "connector": "u3" + }, + { + "points": [ + { + "x": 62, + "y": -10 + }, + { + "x": 66, + "y": -10 + }, + { + "x": 66, + "y": -28 + }, + { + "x": 70, + "y": -28 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + [ + { + "instance": "switch", + "connector": "y" + }, + { + "instance": "y" + }, + { + "points": [ + { + "x": 94, + "y": -20 + }, + { + "x": 96, + "y": -20 + }, + { + "x": 96, + "y": -60 + }, + { + "x": 120, + "y": -60 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ] + ], + "svg": { + "icon": { + "items": { + "width": 300, + "height": 294, + "layerRectangles": [ + { + "x": 50, + "y": 54, + "width": 200, + "height": 240, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolygons": [ + { + "points": "230,250 208,244 208,256 230,250", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "96,174 90,196 102,196 96,174", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "86,250 108,244 108,256 86,250", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "96,102 90,124 102,124 96,102", + "hasFill": true, + "fill": "rgb(95,95,95)", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolylines": [ + { + "points": "158,250 228,250", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "96,196 96,236", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "106,180 120,180 136,216 176,216 188,236 210,236", + "fill": "none", + "stroke": "rgb(0,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "106,180 120,180 136,216 152,216 168,240 210,240", + "fill": "none", + "stroke": "rgb(255,0,0)", + "strokeDasharray": "1,2", + "strokeWidth": 0.5 + }, + { + "points": "146,250 90,250", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "96,124 96,164", + "fill": "none", + "stroke": "rgb(95,95,95)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104,130 122,154 168,154 178,138 188,138 200,120", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "168,154 188,154 200,120 178,120 168,154", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "intPolygons": [ + { + "points": "30,84 50,74 30,64", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,124 50,114 30,104", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,164 50,154 30,144", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,204 50,194 30,184", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,244 50,234 30,224", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,284 50,274 30,264", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "250,124 270,114 250,104", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "250,184 270,174 250,164", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "250,244 270,234 250,224", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 13, + "xStart": 82.5, + "yStart": 190, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 82.5, + "dy": 0, + "textString": "T" + } + ] + }, + { + "font": "helvetica", + "fontSize": 7.15, + "xStart": 226, + "yStart": 261.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 226, + "dy": 0, + "textString": "u" + } + ] + }, + { + "font": "helvetica", + "fontSize": 14.08, + "xStart": 65, + "yStart": 81, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 65, + "dy": 0, + "textString": "uHea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 14.08, + "xStart": 65, + "yStart": 117, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 65, + "dy": 0, + "textString": "uCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 5.49, + "xStart": 231, + "yStart": 113, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 231, + "dy": 0, + "textString": "TSupHeaEco" + } + ] + }, + { + "font": "helvetica", + "fontSize": 7.91, + "xStart": 231, + "yStart": 173, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 231, + "dy": 0, + "textString": "TSupCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 14.3, + "xStart": 237, + "yStart": 235, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 237, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 14.08, + "xStart": 67, + "yStart": 197, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 67, + "dy": 0, + "textString": "TZon" + } + ] + }, + { + "font": "helvetica", + "fontSize": 14.08, + "xStart": 65, + "yStart": 235, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 65, + "dy": 0, + "textString": "TOut" + } + ] + }, + { + "font": "helvetica", + "fontSize": 13, + "xStart": 82.5, + "yStart": 116, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 82.5, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 7.91, + "xStart": 67, + "yStart": 155.00000000000003, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 67, + "dy": 0, + "textString": "TZonSet" + } + ] + }, + { + "font": "helvetica", + "fontSize": 14.08, + "xStart": 65, + "yStart": 267, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 65, + "dy": 0, + "textString": "uFan" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 50, + "y": 294 + }, + { + "x": 250, + "y": 54 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": false, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\nT\n\n\nu\n\n\nuHea\n\n\nuCoo\n\n\nTSupHeaEco\n\n\nTSupCoo\n\n\ny\n\n\nTZon\n\n\nTOut\n\n\ny\n\n\nTZonSet\n\n\nuFan\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "diagram": { + "items": { + "width": 280, + "height": 620, + "layerRectangles": [ + { + "x": 58, + "y": 392, + "width": 166, + "height": 96, + "hasFill": true, + "fill": "rgb(215,215,215)", + "stroke": "rgb(0,0,0)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 56, + "y": 340, + "width": 164, + "height": 38, + "hasFill": true, + "fill": "rgb(215,215,215)", + "stroke": "rgb(0,0,0)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 56, + "y": 256, + "width": 110, + "height": 70, + "hasFill": true, + "fill": "rgb(215,215,215)", + "stroke": "rgb(0,0,0)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 58, + "y": 496, + "width": 166, + "height": 100, + "hasFill": true, + "fill": "rgb(215,215,215)", + "stroke": "rgb(0,0,0)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "intPolygons": [ + { + "points": "20,140 40,130 20,120 20,140", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,180 40,170 20,160 20,180", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,220 40,210 20,200 20,220", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,260 40,250 20,240 20,260", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,330 40,320 20,310 20,330", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,390 40,380 20,370 20,390", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "240,150 260,140 240,130", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "240,210 260,200 240,190", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "240,310 260,300 240,290", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "connectionPolylines": [ + { + "points": "138,60 108,60 108,158 46,158 46,170 20,170", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,60 108,60 108,158 46,158 46,170 20,170", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "162,60 180,60 180,46 198,46", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "162,60 180,60 180,46 198,46", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "222,40 232,40 232,140 260,140", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "222,40 232,40 232,140 260,140", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "162,100 180,100 180,114 198,114", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "162,100 180,100 180,114 198,114", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "162,140 180,140 180,126 198,126", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "162,140 180,140 180,126 198,126", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,100 108,100 108,158 46,158 46,170 20,170", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,100 108,100 108,158 46,158 46,170 20,170", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,140 52,140 52,130 20,130", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,140 52,140 52,130 20,130", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "222,120 224,120 224,200 260,200", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "222,120 224,120 224,200 260,200", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "68,352 54,352 54,250 20,250", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "68,352 54,352 54,250 20,250", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "68,364 52,364 52,320 20,320", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "68,364 52,364 52,320 20,320", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "92,358 108,358", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "92,358 108,358", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,358 132,358", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,358 132,358", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "58,210 20,210", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "58,210 20,210", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,210 88,210 88,16 140,16", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,210 88,210 88,16 140,16", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,90 94,90 94,24 140,24", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,90 94,90 94,24 140,24", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,180 100,180 100,28 140,28", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,180 100,180 100,28 140,28", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,130 52,130 52,138 104,138 104,20 140,20", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "20,130 52,130 52,138 104,138 104,20 140,20", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "164,20 180,20 180,34 198,34", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "164,20 180,20 180,34 198,34", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,20 84,20 84,52 138,52", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,20 84,20 84,52 138,52", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,60 106,60 106,64 138,64", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,60 106,60 106,64 138,64", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,20 84,20 84,56 138,56", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,20 84,20 84,56 138,56", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,210 100,210 100,224 118,224", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,210 100,210 100,224 118,224", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,240 100,240 100,236 118,236", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,240 100,240 100,236 118,236", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,230 148,230", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "142,230 148,230", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "172,230 174,230 174,170 126,170 126,68 138,68", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "172,230 174,230 174,170 126,170 126,68 138,68", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,92 110,92 110,90 82,90", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,92 110,92 110,90 82,90", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,96 88,96 88,210 82,210", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,96 88,96 88,210 82,210", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,104 96,104 96,120 82,120", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,104 96,104 96,120 82,120", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,108 90,108 90,240 82,240", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,108 90,108 90,240 82,240", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,136 84,136 84,20 82,20", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,136 84,136 84,20 82,20", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,132 84,132 84,20 82,20", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,132 84,132 84,20 82,20", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,144 94,144 94,90 82,90", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "138,144 94,144 94,90 82,90", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,184 100,184 100,180 82,180", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "118,184 100,184 100,180 82,180", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,210 100,210 100,196 118,196", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,210 100,210 100,196 118,196", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,190 150,190 150,160 130,160 130,148 138,148", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "142,190 150,190 150,160 130,160 130,148 138,148", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,170 46,170 46,386 102,386 102,432 118,432", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "20,170 46,170 46,386 102,386 102,432 118,432", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,518 86,518", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "102,518 86,518", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "172,528 164,528 164,550 162,550", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "172,528 164,528 164,550 162,550", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "172,516 162,516", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "172,516 162,516", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,170 50,170 50,492 164,492 164,524 172,524", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "20,170 50,170 50,492 164,492 164,524 172,524", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "162,358 174,358", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "162,358 174,358", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,530 98,530 98,400 210,400 210,358 198,358", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "102,530 98,530 98,400 210,400 210,358 198,358", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "178,426 160,426 160,432 142,432", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "178,426 160,426 160,432 142,432", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "178,438 174,438 174,496 200,496 200,524 196,524", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "178,438 174,438 174,496 200,496 200,524 196,524", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "202,432 230,432 230,320 170,320 170,302 178,302", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "202,432 230,432 230,320 170,320 170,302 178,302", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,436 94,436 94,462 82,462", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "118,436 94,436 94,462 82,462", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,406 88,406 88,424 118,424", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,406 88,406 88,424 118,424", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,440 98,440 98,400 210,400 210,358 198,358", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "118,440 98,440 98,400 210,400 210,358 198,358", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,436 90,436 90,428 118,428", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,436 90,436 90,428 118,428", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "126,524 132,524 132,532 172,532", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "126,524 132,524 132,532 172,532", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "162,580 164,580 164,520 172,520", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "162,580 164,580 164,520 172,520", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,12 84,12 84,20 82,20", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "140,12 84,12 84,20 82,20", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "122,270 134,270 134,282 142,282", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "122,270 134,270 134,282 142,282", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,270 84,270 84,286 142,286", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,270 84,270 84,286 142,286", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,130 46,130 46,290 142,290", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "20,130 46,130 46,290 142,290", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "82,310 84,310 84,294 142,294", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "82,310 84,310 84,294 142,294", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "122,310 134,310 134,298 142,298", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "122,310 134,310 134,298 142,298", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "166,290 178,290", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "166,290 178,290", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "20,380 224,380 224,282 208,282 208,260 210,260", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "20,380 224,380 224,282 208,282 208,260 210,260", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "202,296 204,296 204,252 210,252", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "202,296 204,296 204,252 210,252", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "202,250 206,250 206,268 210,268", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "202,250 206,250 206,268 210,268", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "234,260 236,260 236,300 260,300", + "fill": "none", + "stroke": "rgb(255,255,255)", + "strokeDasharray": "1,0", + "strokeWidth": 1.25 + }, + { + "points": "234,260 236,260 236,300 260,300", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": true, + "connectionLineDots": [ + { + "cx": 108, + "cy": 100, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 52, + "cy": 138, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 52, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 88, + "cy": 210, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 94, + "cy": 90, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 88, + "cy": 96, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 88, + "cy": 210, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 90, + "cy": 240, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 52, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 56, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 52, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 56, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 132, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 94, + "cy": 90, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 94, + "cy": 90, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 100, + "cy": 180, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 88, + "cy": 210, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 100, + "cy": 210, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 88, + "cy": 210, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 46, + "cy": 170, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 46, + "cy": 170, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 46, + "cy": 170, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 46, + "cy": 170, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 46, + "cy": 170, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 98, + "cy": 440, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 20, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 20, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 20, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 84, + "cy": 20, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 46, + "cy": 130, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 46, + "cy": 130, + "rx": 1, + "ry": 1, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 4.49, + "xStart": 204, + "yStart": 483, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 204, + "dy": 0, + "textString": "0.25 < yCoo < 0.5" + } + ] + }, + { + "font": "helvetica", + "fontSize": 5.03, + "xStart": 204, + "yStart": 547, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 204, + "dy": 0, + "textString": "0.75 < yCoo < 1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.49, + "xStart": 186, + "yStart": 373, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 186, + "dy": 0, + "textString": "0.5 < yCoo < 0.75" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.9, + "xStart": 139, + "yStart": 315, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 139, + "dy": 0, + "textString": "heating" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.11, + "xStart": 58, + "yStart": 332.445, + "textAnchor": "start", + "fill": "rgb(0,0,0)", + "moreLines": true, + "tSpan": [ + { + "xSpan": 58, + "dy": 0, + "textString": "For cooling, compute the change relative to yMin, and then add the heating and" + }, + { + "xSpan": 58, + "dy": 3.11, + "textString": "cooling control signals to output yFan" + } + ] + } + ], + "classRectangles": [ + { + "x": 212, + "y": 250, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(210,210,210)", + "stroke": "rgb(0,0,0)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 211.908, + "y": 249.908, + "width": 0.092, + "height": 20.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 211.908, + "y": 270, + "width": 20.092, + "height": 0.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 232, + "y": 250, + "width": 0.092, + "height": 20.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.2 + }, + { + "x": 212, + "y": 249.908, + "width": 20.092, + "height": 0.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 212, + "y": 250, + "width": 0.13799999999999998, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 212, + "y": 250, + "width": 20, + "height": 0.138, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 231.90800000000002, + "y": 250, + "width": 0.092, + "height": 20, + "hasFill": true, + "fill": "rgb(113,111,100)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.2 + }, + { + "x": 212, + "y": 269.908, + "width": 20, + "height": 0.092, + "hasFill": true, + "fill": "rgb(113,111,100)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 231.816, + "y": 250.092, + "width": 0.092, + "height": 19.816, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.2 + }, + { + "x": 212.092, + "y": 269.81600000000003, + "width": 19.816, + "height": 0.092, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.04 + }, + { + "x": 180, + "y": 240, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 140, + "y": 90, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 140, + "y": 50, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 200, + "y": 30, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 140, + "y": 130, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 200, + "y": 110, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 70, + "y": 348, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 110, + "y": 348, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.05 + }, + { + "x": 140, + "y": 348, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 200, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 142, + "y": 10, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 10, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 50, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 80, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 110, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 170, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 230, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 120, + "y": 220, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 150, + "y": 220, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.05 + }, + { + "x": 120, + "y": 180, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 144, + "y": 280, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 120, + "y": 422, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 396, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 452, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 140, + "y": 540, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 426, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 64, + "y": 508, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 104, + "y": 514, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 174, + "y": 514, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 140, + "y": 506, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 140, + "y": 570, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 176, + "y": 348, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.05 + }, + { + "x": 180, + "y": 286, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 180, + "y": 422, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 100, + "y": 260, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 260, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 60, + "y": 300, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + }, + { + "x": 100, + "y": 300, + "width": 20, + "height": 20, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.03 + } + ], + "classPolygons": [ + { + "points": "210,253 212,252 210,251", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "210,261 212,260 210,259", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "210,269 212,268 210,267", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "232,261 234,260 232,259", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "182,241 181.2,243.2 182.8,243.2 182,241", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "199,257 196.8,256.2 196.8,257.8 199,257", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "200,251 202,250 200,249", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "159.2,107.8 157,107 157,108.6 159.2,107.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,90.8 141.2,93 142.8,93 142,90.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,93 140,92 138,91", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,97 140,96 138,95", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,105 140,104 138,103", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,109 140,108 138,107", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,101 140,100 138,99", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "160,101 162,100 160,99", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "159.2,67.8 157,67 157,68.6 159.2,67.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,50.8 141.2,53 142.8,53 142,50.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,53 140,52 138,51", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,57 140,56 138,55", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,65 140,64 138,63", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,69 140,68 138,67", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,61 140,60 138,59", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "160,61 162,60 160,59", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "198,35 200,34 198,33", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "198,47 200,46 198,45", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "220,41 222,40 220,39", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "159.2,147.8 157,147 157,148.6 159.2,147.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,130.8 141.2,133 142.8,133 142,130.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,133 140,132 138,131", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,137 140,136 138,135", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,145 140,144 138,143", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,149 140,148 138,147", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,141 140,140 138,139", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "160,141 162,140 160,139", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "198,115 200,114 198,113", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "198,127 200,126 198,125", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "220,121 222,120 220,119", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "68,353 70,352 68,351", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "68,365 70,364 68,363", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "90,359 92,358 90,357", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "111.4,361.6 111.4,354.4 116.60000000000001,358 111.4,361.6", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "108,359 110,358 108,357", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "130,359 132,358 130,357", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "150,349 149.2,351.2 150.8,351.2 150,349", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "159,358 156.8,358.8 156.8,357.2 159,358", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "138,359 140,358 138,357", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "160,359 162,358 160,357", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,201 69.2,203.2 70.8,203.2 70,201", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,210 76.8,210.8 76.8,209.2 79,210", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "58,211 60,210 58,209", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,211 82,210 80,209", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "161.2,27.8 159,27 159,28.599999999999998 161.2,27.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "144,10.8 143.2,13 144.8,13 144,10.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,13 142,12 140,11", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,17 142,16 140,15", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,25 142,24 140,23", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,29 142,28 140,27", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,21 142,20 140,19", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "162,21 164,20 162,19", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,11 61.2,13.2 62.8,13.2 62,11", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,27 76.8,26.2 76.8,27.8 79,27", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,21 82,20 80,19", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,51 61.2,53.2 62.8,53.2 62,51", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,67 76.8,66.2 76.8,67.8 79,67", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,61 82,60 80,59", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,81 61.2,83.2 62.8,83.2 62,81", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,97 76.8,96.2 76.8,97.8 79,97", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,91 82,90 80,89", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,111 61.2,113.2 62.8,113.2 62,111", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,127 76.8,126.2 76.8,127.8 79,127", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,121 82,120 80,119", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,171 61.2,173.2 62.8,173.2 62,171", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,187 76.8,186.2 76.8,187.8 79,187", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,181 82,180 80,179", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,231 61.2,233.2 62.8,233.2 62,231", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,247 76.8,246.2 76.8,247.8 79,247", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,241 82,240 80,239", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,225 120,224 118,223", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,237 120,236 118,235", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,231 142,230 140,229", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "151.4,233.6 151.4,226.4 156.60000000000002,230 151.4,233.6", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "148,231 150,230 148,229", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "170,231 172,230 170,229", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,185 120,184 118,183", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,197 120,196 118,195", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,191 142,190 140,189", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "163.2,297.8 161,297 161,298.6 163.2,297.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "146,280.8 145.2,283 146.8,283 146,280.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,283 144,282 142,281", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,287 144,286 142,285", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,295 144,294 142,293", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,299 144,298 142,297", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,291 144,290 142,289", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "164,291 166,290 164,289", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "139.2,439.8 137,439 137,440.6 139.2,439.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "122,422.8 121.2,425 122.8,425 122,422.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,425 120,424 118,423", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,429 120,428 118,427", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,437 120,436 118,435", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,441 120,440 118,439", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "118,433 120,432 118,431", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,433 142,432 140,431", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,397 61.2,399.2 62.8,399.2 62,397", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,413 76.8,412.2 76.8,413.8 79,413", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,407 82,406 80,405", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,453 61.2,455.2 62.8,455.2 62,453", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,469 76.8,468.2 76.8,469.8 79,469", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,463 82,462 80,461", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,541 141.2,543.2 142.8,543.2 142,541", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "159,557 156.8,556.2 156.8,557.8 159,557", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "160,551 162,550 160,549", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,427 61.2,429.2 62.8,429.2 62,427", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,443 76.8,442.2 76.8,443.8 79,443", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,437 82,436 80,435", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "66,509 65.2,511.2 66.8,511.2 66,509", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "83,525 80.8,524.2 80.8,525.8 83,525", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "84,519 86,518 84,517", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,519 104,518 102,517", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,531 104,530 102,529", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "124,525 126,524 124,523", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "193.2,531.8 191,531 191,532.6 193.2,531.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "176,514.8 175.2,517 176.8,517 176,514.8", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "172,517 174,516 172,515", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "172,521 174,520 172,519", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "172,529 174,528 172,527", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "172,533 174,532 172,531", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "172,525 174,524 172,523", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "194,525 196,524 194,523", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,507 141.2,509.2 142.8,509.2 142,507", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "159,523 156.8,522.2 156.8,523.8 159,523", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "160,517 162,516 160,515", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,571 141.2,573.2 142.8,573.2 142,571", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "159,587 156.8,586.2 156.8,587.8 159,587", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "160,581 162,580 160,579", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "177.4,361.6 177.4,354.4 182.60000000000002,358 177.4,361.6", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "174,359 176,358 174,357", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "196,359 198,358 196,357", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "178,291 180,290 178,289", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "178,303 180,302 178,301", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "200,297 202,296 200,295", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "178,427 180,426 178,425", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "178,439 180,438 178,437", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "200,433 202,432 200,431", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,261 101.2,263.2 102.8,263.2 102,261", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "119,277 116.8,276.2 116.8,277.8 119,277", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,271 122,270 120,269", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,261 61.2,263.2 62.8,263.2 62,261", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,277 76.8,276.2 76.8,277.8 79,277", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,271 82,270 80,269", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,301 61.2,303.2 62.8,303.2 62,301", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "79,317 76.8,316.2 76.8,317.8 79,317", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "80,311 82,310 80,309", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,301 101.2,303.2 102.8,303.2 102,301", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "119,317 116.8,316.2 116.8,317.8 119,317", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,311 122,310 120,309", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "classEllipses": [ + { + "cx": 223, + "cy": 260, + "rx": 0.8, + "ry": 0.8, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 214.2, + "cy": 260, + "rx": 0.7000000000000001, + "ry": 0.7000000000000001, + "hasFill": true, + "fill": "rgb(235,235,235)", + "hasPattern": true, + "stroke": "rgb(235,235,235)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 155, + "cy": 104.4, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 150.8, + "cy": 100.8, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 145.4, + "cy": 96, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 155, + "cy": 64.4, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 150.8, + "cy": 60.8, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 145.4, + "cy": 56, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 210, + "cy": 40, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 155, + "cy": 144.4, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 150.8, + "cy": 140.8, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 145.4, + "cy": 136, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 210, + "cy": 120, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 80, + "cy": 358, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 123.80000000000001, + "cy": 358.2, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 157, + "cy": 24.400000000000002, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 152.8, + "cy": 20.8, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 147.4, + "cy": 16, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 130, + "cy": 230, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 163.8, + "cy": 230.2, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 130, + "cy": 190, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 159, + "cy": 294.4, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 154.8, + "cy": 290.8, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 149.4, + "cy": 286, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 135, + "cy": 436.4, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 130.8, + "cy": 432.8, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 125.4, + "cy": 428, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 114, + "cy": 524, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 189, + "cy": 528.4, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 184.8, + "cy": 524.8, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 179.4, + "cy": 520, + "rx": 0.6, + "ry": 0.6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 189.8, + "cy": 358.2, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 190, + "cy": 296, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "cx": 190, + "cy": 432, + "rx": 5, + "ry": 5, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "classPolylines": [ + { + "points": "223.2,260 232,260", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "212,260 218,260", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "212,268 218,268 218,268", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "218,258.8 218,261.2", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "212,252 218.2,252", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "218.2,252 222.6,259.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 1 + }, + { + "points": "182,243.2 182,258", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "181,257 198.2,257", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "182,250 198,250", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "145.4,96 155,104.4", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,108 142,92.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "141.2,107.8 157.6,107.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,92 143.6,92", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "143.6,92 143.8,107.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,96 141.2,96", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "141.2,96 145.2,96", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,104 154.8,103.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "154.8,103.6 155,107.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,108 146.2,105.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "146.2,105.6 154.8,104.4", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,100 143.8,100", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "143.8,100 150.8,100.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "151,100.8 155.2,100.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "155.2,100.8 160,100", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "155,104.4 158,107", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "155.2,104.4 158.6,104.4", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,93.2 145.4,96", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,96 145.4,96", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "145.4,56 155,64.4", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,68 142,52.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "141.2,67.8 157.6,67.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,52 143.6,52", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "143.6,52 143.8,67.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,56 141.2,56", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "141.2,56 145.2,56", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,64 154.8,63.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "154.8,63.6 155,67.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,68 146.2,65.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "146.2,65.6 154.8,64.4", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,60 143.8,60", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "143.8,60 150.8,60.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "151,60.8 155.2,60.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "155.2,60.8 160,60", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "155,64.4 158,67", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "155.2,64.4 158.6,64.4", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,53.2 145.4,56", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,56 145.4,56", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "200,34 202.6,37.6 205.6,37.6", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "200,46 202.6,42.8 205.8,42.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "215,40 220,40", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "145.4,136 155,144.4", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,148 142,132.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "141.2,147.8 157.6,147.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "140,132 143.6,132", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "143.6,132 143.8,147.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,136 141.2,136", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "141.2,136 145.2,136", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,144 154.8,143.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "154.8,143.6 155,147.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,148 146.2,145.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "146.2,145.6 154.8,144.4", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "140,140 143.8,140", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "143.8,140 150.8,140.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "151,140.8 155.2,140.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "155.2,140.8 160,140", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "155,144.4 158,147", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "155.2,144.4 158.6,144.4", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,133.2 145.4,136", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,136 145.4,136", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "200,114 202.6,117.6 205.6,117.6", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "200,126 202.6,122.8 205.8,122.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "215,120 220,120", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,352 72.6,355.6 75.6,355.6", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,364 72.6,360.8 75.8,360.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "85,358 90,358", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "114.60000000000001,351.4 117.2,355 120.2,355", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "110,358 130,358", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "150,367 150,351.2", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "141,358 156.8,358", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,365 145,365 155,351 158,351", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "155,351 158,351", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,365 145,365", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,219 70,203.2", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,210 76.8,210", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,217 65,217 75,203 78,203", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "75,203 78,203", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,217 65,217", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "147.4,16 157,24.400000000000002", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "144,28 144,12.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "143.2,27.8 159.6,27.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,12 145.6,12", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "145.6,12 145.8,27.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "142,16 143.2,16", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "143.2,16 147.2,16", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "142,24 156.8,23.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "156.8,23.6 157,27.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "142,28 148.2,25.599999999999998", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "148.2,25.599999999999998 156.8,24.400000000000002", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "142,20 145.8,20", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "145.8,20 152.8,20.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "153,20.8 157.2,20.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "157.2,20.8 162,20", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "157,24.400000000000002 160,27", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "157.2,24.400000000000002 160.6,24.400000000000002", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "144,13.200000000000001 147.4,16", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "144,16 147.4,16", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "62,13.2 62,28", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,27 78.2,27", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,20 78,20", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,53.2 62,68", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,67 78.2,67", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,60 78,60", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,83.2 62,98", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,97 78.2,97", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,90 78,90", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,113.2 62,128", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,127 78.2,127", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,120 78,120", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,173.2 62,188", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,187 78.2,187", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,180 78,180", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,233.2 62,248", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,247 78.2,247", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,240 78,240", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,224 122.6,227.6 125.6,227.6", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,236 122.6,232.8 125.8,232.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "135,230 140,230", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "154.6,223.4 157.20000000000002,227 160.20000000000002,227", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "150,230 170,230", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,184 122.6,187.6 125.6,187.6", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,196 122.6,192.8 125.8,192.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "135,190 140,190", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "149.4,286 159,294.4", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "146,298 146,282.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "145.2,297.8 161.6,297.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "144,282 147.6,282", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "147.6,282 147.8,297.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "144,286 145.2,286", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "145.2,286 149.2,286", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "144,294 158.8,293.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "158.8,293.6 159,297.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "144,298 150.2,295.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "150.2,295.6 158.8,294.4", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "144,290 147.8,290", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "147.8,290 154.8,290.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "155,290.8 159.2,290.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "159.2,290.8 164,290", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "159,294.4 162,297", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "159.2,294.4 162.6,294.4", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "146,283.2 149.4,286", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "146,286 149.4,286", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "125.4,428 135,436.4", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "122,440 122,424.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "121.2,439.8 137.6,439.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "120,424 123.6,424", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "123.6,424 123.8,439.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "120,428 121.2,428", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "121.2,428 125.2,428", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "120,436 134.8,435.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "134.8,435.6 135,439.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "120,440 126.2,437.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "126.2,437.6 134.8,436.4", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "120,432 123.8,432", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "123.8,432 130.8,432.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "131,432.8 135.2,432.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "135.2,432.8 140,432", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "135,436.4 138,439", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "135.2,436.4 138.6,436.4", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "122,425.2 125.4,428", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "122,428 125.4,428", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "62,399.2 62,414", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,413 78.2,413", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,406 78,406", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,455.2 62,470", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,469 78.2,469", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,462 78,462", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,543.2 142,558", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "141,557 158.2,557", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,550 158,550", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,429.2 62,444", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,443 78.2,443", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,436 78,436", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "66,511.2 66,526", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "65,525 82.2,525", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "66,518 82,518", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104,518 106.6,521.6 109.6,521.6", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "104,530 106.6,526.8 109.8,526.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "119,524 124,524", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "179.4,520 189,528.4", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "176,532 176,516.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "175.2,531.8 191.6,531.8", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "174,516 177.6,516", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "177.6,516 177.8,531.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "174,520 175.2,520", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "175.2,520 179.2,520", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "174,528 188.8,527.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "188.8,527.6 189,531.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "174,532 180.2,529.6", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "180.2,529.6 188.8,528.4", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "174,524 177.8,524", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "177.8,524 184.8,524.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "185,524.8 189.2,524.8", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "189.2,524.8 194,524", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "189,528.4 192,531", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "189.2,528.4 192.6,528.4", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "176,517.2 179.4,520", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "176,520 179.4,520", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "142,509.2 142,524", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "141,523 158.2,523", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,516 158,516", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,573.2 142,588", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "141,587 158.2,587", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "142,580 158,580", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "180.6,351.4 183.20000000000002,355 186.20000000000002,355", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "176,358 196,358", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "180,290 182.6,293.6 185.6,293.6", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "180,302 182.6,298.8 185.8,298.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "195,296 200,296", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "180,426 182.6,429.6 185.6,429.6", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "180,438 182.6,434.8 185.8,434.8", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "195,432 200,432", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,263.2 102,278", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "101,277 118.2,277", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,270 118,270", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,263.2 62,278", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,277 78.2,277", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,270 78,270", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,303.2 62,318", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "61,317 78.2,317", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,310 78,310", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,303.2 102,318", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "101,317 118.2,317", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "102,310 118,310", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "classTexts": [ + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 14.2625, + "yStart": 115.5, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 14.2625, + "dy": 0, + "textString": "uHea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 14.2625, + "yStart": 155.5, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 14.2625, + "dy": 0, + "textString": "uCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 14.2625, + "yStart": 195.5, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 14.2625, + "dy": 0, + "textString": "TZonSet" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 14.2625, + "yStart": 235.5, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 14.2625, + "dy": 0, + "textString": "TZon" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 14.2625, + "yStart": 305.5, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 14.2625, + "dy": 0, + "textString": "TOut" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 14.2625, + "yStart": 365.5, + "textAnchor": "middle", + "fill": "rgb(255,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 14.2625, + "dy": 0, + "textString": "uFan" + } + ] + }, + { + "font": "helvetica", + "fontSize": 6.5, + "xStart": 258.525, + "yStart": 123, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 258.525, + "dy": 0, + "textString": "TSupHeaEco" + } + ] + }, + { + "font": "helvetica", + "fontSize": 6.5, + "xStart": 258.525, + "yStart": 183, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 258.525, + "dy": 0, + "textString": "TSupCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 6.5, + "xStart": 258.525, + "yStart": 283, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 258.525, + "dy": 0, + "textString": "y" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 222, + "yStart": 247, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 222, + "dy": 0, + "textString": "switch" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 190, + "yStart": 237, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 190, + "dy": 0, + "textString": "fanOff" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 190, + "yStart": 263, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 190, + "dy": 0, + "textString": "k=0" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 206.6, + "yStart": 246.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 206.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 87, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "TSetCooHig" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 166.6, + "yStart": 96.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 166.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 47, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "offSetTSetHea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 166.6, + "yStart": 56.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 166.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 210, + "yStart": 27, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 210, + "dy": 0, + "textString": "addTHe" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 209.8, + "yStart": 38.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 209.8, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 205.25, + "yStart": 32.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 205.25, + "dy": 0, + "textString": "+1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 205.25, + "yStart": 47.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 205.25, + "dy": 0, + "textString": "+1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 226.6, + "yStart": 36.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 226.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 127, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "offSetTSetCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 166.6, + "yStart": 136.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 166.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 210, + "yStart": 107, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 210, + "dy": 0, + "textString": "addTSupCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 209.8, + "yStart": 118.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 209.8, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 205.25, + "yStart": 112.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 205.25, + "dy": 0, + "textString": "+1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 205.25, + "yStart": 127.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 205.25, + "dy": 0, + "textString": "+1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 226.6, + "yStart": 116.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 226.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 80, + "yStart": 345, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 80, + "dy": 0, + "textString": "dT" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 79.8, + "yStart": 356.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 79.8, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 75.25, + "yStart": 350.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 75.25, + "dy": 0, + "textString": "%k1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 75.25, + "yStart": 365.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 75.25, + "dy": 0, + "textString": "-1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 96.6, + "yStart": 354.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 96.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 120, + "yStart": 345, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 120, + "dy": 0, + "textString": "yMed" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 113.05000000000001, + "yStart": 350.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 113.05000000000001, + "dy": 0, + "textString": "yCooMax - (yMin - yCooMax)/(0.56 - 5.6)*5.6" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 115.4, + "yStart": 364.4, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 115.4, + "dy": 0, + "textString": "k=(yMin - yCooMax)/(0.56 - 5.6)" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 123.60000000000001, + "yStart": 356.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 123.60000000000001, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 136.60000000000002, + "yStart": 354.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 136.60000000000002, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 345, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "yMedLim" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 345, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "yMedLim" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.69, + "xStart": 155.3, + "yStart": 349.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 155.3, + "dy": 0, + "textString": "yCooMax" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.69, + "xStart": 144.1, + "yStart": 366.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 144.1, + "dy": 0, + "textString": "yMin" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 166.6, + "yStart": 354.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 166.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 197, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "TDea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 197, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "TDea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.69, + "xStart": 75.3, + "yStart": 201.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 75.3, + "dy": 0, + "textString": "24 + 273.15" + } + ] + }, + { + "font": "helvetica", + "fontSize": 1.69, + "xStart": 64.1, + "yStart": 218.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 64.1, + "dy": 0, + "textString": "21 + 273.15" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 206.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 152, + "yStart": 7, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 152, + "dy": 0, + "textString": "TSetHeaHig" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 168.6, + "yStart": 16.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 168.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 7, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "con0" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 33, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=0" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 16.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 47, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "con25" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 73, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=0.25" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 56.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 77, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "con05" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 103, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=0.5" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 86.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 107, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "con75" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 133, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=0.75" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 116.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 167, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "conTSupSetMax" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 193, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=TSupSetMax" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 176.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 227, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "conTSupSetMin" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 253, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=TSupSetMin" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 236.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 130, + "yStart": 217, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 130, + "dy": 0, + "textString": "TDeaTSupSetMin" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 129.8, + "yStart": 228.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 129.8, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 125.25, + "yStart": 222.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 125.25, + "dy": 0, + "textString": "%k1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 125.25, + "yStart": 237.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 125.25, + "dy": 0, + "textString": "-1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 146.6, + "yStart": 226.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 146.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 160, + "yStart": 217, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 160, + "dy": 0, + "textString": "addTDea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 153.05, + "yStart": 222.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 153.05, + "dy": 0, + "textString": "-1.1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 155.4, + "yStart": 236.4, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 155.4, + "dy": 0, + "textString": "k=-1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 163.60000000000002, + "yStart": 228.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 163.60000000000002, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 176.60000000000002, + "yStart": 226.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 176.60000000000002, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 130, + "yStart": 177, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 130, + "dy": 0, + "textString": "TSupSetMaxTDea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 129.8, + "yStart": 188.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 129.8, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 125.25, + "yStart": 182.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 125.25, + "dy": 0, + "textString": "%k1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 125.25, + "yStart": 197.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 125.25, + "dy": 0, + "textString": "-1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 146.6, + "yStart": 186.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 146.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 154, + "yStart": 277, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 154, + "dy": 0, + "textString": "yHea" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 170.6, + "yStart": 286.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 170.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 130, + "yStart": 419, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 130, + "dy": 0, + "textString": "lin050" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 146.6, + "yStart": 428.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 146.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 393, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "con025" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 419, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=0.25" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 402.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 449, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "con1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 475, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=0.5" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 458.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 537, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "con2" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 563, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "k=1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 166.6, + "yStart": 546.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 166.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 423, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "con3" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 449, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=0" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 432.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 74, + "yStart": 505, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 74, + "dy": 0, + "textString": "con4" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 74, + "yStart": 531, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 74, + "dy": 0, + "textString": "k=yCooMax - yMin" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 90.6, + "yStart": 514.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 90.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 114, + "yStart": 511, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 114, + "dy": 0, + "textString": "dY075" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 113.8, + "yStart": 522.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 113.8, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 109.25, + "yStart": 516.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 109.25, + "dy": 0, + "textString": "1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 109.25, + "yStart": 531.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 109.25, + "dy": 0, + "textString": "-1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 130.6, + "yStart": 520.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 130.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 184, + "yStart": 511, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 184, + "dy": 0, + "textString": "lin075" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 200.6, + "yStart": 520.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 200.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 503, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "con5" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 529, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "k=0.75" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 166.6, + "yStart": 512.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 166.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 567, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "con6" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 150, + "yStart": 593, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "k=0" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 166.6, + "yStart": 576.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 166.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 186, + "yStart": 345, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 186, + "dy": 0, + "textString": "yOffSet" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 179.05, + "yStart": 350.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 179.05, + "dy": 0, + "textString": "-yMin" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 181.4, + "yStart": 364.4, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 181.4, + "dy": 0, + "textString": "k=1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 189.60000000000002, + "yStart": 356.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 189.60000000000002, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 202.60000000000002, + "yStart": 354.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 202.60000000000002, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 190, + "yStart": 283, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 190, + "dy": 0, + "textString": "addHeaCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 189.8, + "yStart": 294.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 189.8, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 185.25, + "yStart": 288.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 185.25, + "dy": 0, + "textString": "1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 185.25, + "yStart": 303.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 185.25, + "dy": 0, + "textString": "1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 206.6, + "yStart": 292.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 206.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 190, + "yStart": 419, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 190, + "dy": 0, + "textString": "offCoo" + } + ] + }, + { + "font": "helvetica", + "fontSize": 4.42, + "xStart": 189.8, + "yStart": 430.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 189.8, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 185.25, + "yStart": 424.8, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 185.25, + "dy": 0, + "textString": "1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 185.25, + "yStart": 439.2, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 185.25, + "dy": 0, + "textString": "1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 206.6, + "yStart": 428.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 206.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 110, + "yStart": 257, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 110, + "dy": 0, + "textString": "con7" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 110, + "yStart": 283, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 110, + "dy": 0, + "textString": "k=0.5" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 126.6, + "yStart": 266.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 126.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 257, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "minSpe" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 283, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=yMin" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 266.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 297, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "conOne" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 70, + "yStart": 323, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 70, + "dy": 0, + "textString": "k=1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 86.6, + "yStart": 306.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 86.6, + "dy": 0, + "textString": "" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 110, + "yStart": 297, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 110, + "dy": 0, + "textString": "maxHeaSpe" + } + ] + }, + { + "font": "helvetica", + "fontSize": 2.6, + "xStart": 110, + "yStart": 323, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 110, + "dy": 0, + "textString": "k=yHeaMax" + } + ] + }, + { + "font": "helvetica", + "fontSize": 3.25, + "xStart": 126.6, + "yStart": 306.5, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 126.6, + "dy": 0, + "textString": "" + } + ] + } + ] + }, + "initialScale": 0.1, + "preserveAspectRatio": false, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n0.25 < yCoo < 0.5\n\n\n0.75 < yCoo < 1\n\n\n0.5 < yCoo < 0.75\n\n\nheating\n\n\nFor cooling, compute the change relative to yMin, and then add the heating and\ncooling control signals to output yFan\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nuHea\n\n\nuCoo\n\n\nTZonSet\n\n\nTZon\n\n\nTOut\n\n\nuFan\n\n\nTSupHeaEco\n\n\nTSupCoo\n\n\ny\n\n\nswitch\n\n\nfanOff\n\n\nk=0\n\n\n\n\n\nTSetCooHig\n\n\n\n\n\noffSetTSetHea\n\n\n\n\n\naddTHe\n\n\n+\n\n\n+1\n\n\n+1\n\n\n\n\n\noffSetTSetCoo\n\n\n\n\n\naddTSupCoo\n\n\n+\n\n\n+1\n\n\n+1\n\n\n\n\n\ndT\n\n\n+\n\n\n%k1\n\n\n-1\n\n\n\n\n\nyMed\n\n\nyCooMax - (yMin - yCooMax)/(0.56 - 5.6)*5.6\n\n\nk=(yMin - yCooMax)/(0.56 - 5.6)\n\n\n+\n\n\n\n\n\nyMedLim\n\n\nyMedLim\n\n\nyCooMax\n\n\nyMin\n\n\n\n\n\nTDea\n\n\nTDea\n\n\n24 + 273.15\n\n\n21 + 273.15\n\n\n\n\n\nTSetHeaHig\n\n\n\n\n\ncon0\n\n\nk=0\n\n\n\n\n\ncon25\n\n\nk=0.25\n\n\n\n\n\ncon05\n\n\nk=0.5\n\n\n\n\n\ncon75\n\n\nk=0.75\n\n\n\n\n\nconTSupSetMax\n\n\nk=TSupSetMax\n\n\n\n\n\nconTSupSetMin\n\n\nk=TSupSetMin\n\n\n\n\n\nTDeaTSupSetMin\n\n\n+\n\n\n%k1\n\n\n-1\n\n\n\n\n\naddTDea\n\n\n-1.1\n\n\nk=-1\n\n\n+\n\n\n\n\n\nTSupSetMaxTDea\n\n\n+\n\n\n%k1\n\n\n-1\n\n\n\n\n\nyHea\n\n\n\n\n\nlin050\n\n\n\n\n\ncon025\n\n\nk=0.25\n\n\n\n\n\ncon1\n\n\nk=0.5\n\n\n\n\n\ncon2\n\n\nk=1\n\n\n\n\n\ncon3\n\n\nk=0\n\n\n\n\n\ncon4\n\n\nk=yCooMax - yMin\n\n\n\n\n\ndY075\n\n\n+\n\n\n1\n\n\n-1\n\n\n\n\n\nlin075\n\n\n\n\n\ncon5\n\n\nk=0.75\n\n\n\n\n\ncon6\n\n\nk=0\n\n\n\n\n\nyOffSet\n\n\n-yMin\n\n\nk=1\n\n\n+\n\n\n\n\n\naddHeaCoo\n\n\n+\n\n\n1\n\n\n1\n\n\n\n\n\noffCoo\n\n\n+\n\n\n1\n\n\n1\n\n\n\n\n\ncon7\n\n\nk=0.5\n\n\n\n\n\nminSpe\n\n\nk=yMin\n\n\n\n\n\nconOne\n\n\nk=1\n\n\n\n\n\nmaxHeaSpe\n\n\nk=yHeaMax\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Continuous/Sources/Constant.mo", + "within": "Buildings.Controls.OBC.CDL.Continuous.Sources", + "topClassName": "Buildings.Controls.OBC.CDL.Continuous.Sources.Constant", + "comment": "Output constant signal of type Real", + "defaultName": "\"con\"", + "public": { + "parameters": [ + { + "className": "Real", + "type": "Real", + "name": "k", + "comment": "Constant output value", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "y", + "comment": "Connector of Real output signal", + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + } + ] + }, + "info": "\n

\nBlock that outputs a constant signal y = k,\nwhere k is a real-valued parameter.\n

\n

\n\"Constant.png\"\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + }, + "graphics": { + "line": [ + { + "points": [ + { + "x": -80, + "y": 68 + }, + { + "x": -80, + "y": -80 + } + ], + "color": { + "r": 192, + "g": 192, + "b": 192 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -90, + "y": -70 + }, + { + "x": 82, + "y": -70 + } + ], + "color": { + "r": 192, + "g": 192, + "b": 192 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -80, + "y": 0 + }, + { + "x": 80, + "y": 0 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + "polygon": [ + { + "lineColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -80, + "y": 90 + }, + { + "x": -88, + "y": 68 + }, + { + "x": -72, + "y": 68 + }, + { + "x": -80, + "y": 90 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + }, + { + "lineColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 90, + "y": -70 + }, + { + "x": 68, + "y": -62 + }, + { + "x": 68, + "y": -78 + }, + { + "x": 90, + "y": -70 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + } + ], + "rectangle": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 110 + }, + { + "x": 150, + "y": 150 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": -150, + "y": -150 + }, + { + "x": 150, + "y": -110 + } + ], + "textString": "\"k=%k\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": 226, + "y": 60 + }, + { + "x": 106, + "y": 10 + } + ], + "dynTextString": { + "firstOpt": "\"\"", + "secondOpt": "String(y, leftjustified=false, significantDigits=3)" + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "width": 376, + "height": 300, + "layerRectangles": [ + { + "x": 50, + "y": 50, + "width": 200, + "height": 200, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolygons": [ + { + "points": "70,60 62,82 78,82 70,60", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "240,220 218,212 218,228 240,220", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolylines": [ + { + "points": "70,82 70,230", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "60,220 232,220", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,150 230,150", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "intPolygons": [ + { + "points": "250,160 270,150 250,140", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 280, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "k=%k" + } + ] + }, + { + "font": "helvetica", + "fontSize": 32.5, + "xStart": 316, + "yStart": 115, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 316, + "dy": 0, + "textString": "" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 50, + "y": 250 + }, + { + "x": 250, + "y": 50 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\nk=%k\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Continuous/Sources/Ramp.mo", + "within": "Buildings.Controls.OBC.CDL.Continuous.Sources", + "topClassName": "Buildings.Controls.OBC.CDL.Continuous.Sources.Ramp", + "comment": "Generate ramp signal", + "defaultName": "\"ram\"", + "public": { + "parameters": [ + { + "className": "Real", + "type": "Real", + "name": "height", + "value": "1", + "comment": "Height of ramps", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + }, + { + "className": "Modelica.SIunits.Time", + "type": "Real", + "name": "duration", + "comment": "Duration of ramp (= 0.0 gives a Step)", + "min": { + "value": "Constants.small" + }, + "modifications": [ + { + "value": "Constants.small", + "isFinal": false + } + ], + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + }, + { + "className": "Real", + "type": "Real", + "name": "offset", + "value": "0", + "comment": "Offset of output signal", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + }, + { + "className": "Modelica.SIunits.Time", + "type": "Real", + "name": "startTime", + "value": "0", + "comment": "Output = offset for time < startTime", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "y", + "comment": "Connector of Real output signal", + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + } + ] + }, + "info": "\n

\nThe Real output y is a ramp signal:\n

\n\n

\n\"Ramp.png\"\n

\n\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + }, + "graphics": { + "line": [ + { + "points": [ + { + "x": -80, + "y": 68 + }, + { + "x": -80, + "y": -80 + } + ], + "color": { + "r": 192, + "g": 192, + "b": 192 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -90, + "y": -70 + }, + { + "x": 82, + "y": -70 + } + ], + "color": { + "r": 192, + "g": 192, + "b": 192 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -80, + "y": -70 + }, + { + "x": -40, + "y": -70 + }, + { + "x": 31, + "y": 38 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": 31, + "y": 38 + }, + { + "x": 86, + "y": 38 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + "polygon": [ + { + "lineColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -80, + "y": 90 + }, + { + "x": -88, + "y": 68 + }, + { + "x": -72, + "y": 68 + }, + { + "x": -80, + "y": 90 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + }, + { + "lineColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 90, + "y": -70 + }, + { + "x": 68, + "y": -62 + }, + { + "x": 68, + "y": -78 + }, + { + "x": 90, + "y": -70 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + } + ], + "rectangle": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 110 + }, + { + "x": 150, + "y": 150 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": -150, + "y": -150 + }, + { + "x": 150, + "y": -110 + } + ], + "textString": "\"duration=%duration\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": 226, + "y": 60 + }, + { + "x": 106, + "y": 10 + } + ], + "dynTextString": { + "firstOpt": "\"\"", + "secondOpt": "String(y, leftjustified=false, significantDigits=3)" + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "width": 376, + "height": 300, + "layerRectangles": [ + { + "x": 50, + "y": 50, + "width": 200, + "height": 200, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolygons": [ + { + "points": "70,60 62,82 78,82 70,60", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "240,220 218,212 218,228 240,220", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolylines": [ + { + "points": "70,82 70,230", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "60,220 232,220", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,220 110,220 181,112", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "181,112 236,112", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "intPolygons": [ + { + "points": "250,160 270,150 250,140", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 280, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "duration=%duration" + } + ] + }, + { + "font": "helvetica", + "fontSize": 32.5, + "xStart": 316, + "yStart": 115, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 316, + "dy": 0, + "textString": "" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 50, + "y": 250 + }, + { + "x": 250, + "y": 50 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\nduration=%duration\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Logical/Sources/Constant.mo", + "within": "Buildings.Controls.OBC.CDL.Logical.Sources", + "topClassName": "Buildings.Controls.OBC.CDL.Logical.Sources.Constant", + "comment": "Output constant signal of type Boolean", + "defaultName": "\"con\"", + "public": { + "parameters": [ + { + "className": "Boolean", + "type": "Boolean", + "name": "k", + "comment": "Constant output value", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput", + "name": "y", + "comment": "Connector of Boolean output signal", + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + } + ] + }, + "info": "\n

\nBlock that outputs a constant signal y = k,\nwhere k is a Boolean-valued parameter.\n

\n\n

\n\"Constant.png\"\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + }, + "graphics": { + "line": [ + { + "points": [ + { + "x": -90, + "y": -70 + }, + { + "x": 72, + "y": -70 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 255 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -80, + "y": 66 + }, + { + "x": -80, + "y": -82 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 255 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -80, + "y": 0 + }, + { + "x": 64, + "y": 0 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + "polygon": [ + { + "lineColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 90, + "y": -70 + }, + { + "x": 68, + "y": -62 + }, + { + "x": 68, + "y": -78 + }, + { + "x": 90, + "y": -70 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + }, + { + "lineColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -80, + "y": 88 + }, + { + "x": -88, + "y": 66 + }, + { + "x": -72, + "y": 66 + }, + { + "x": -80, + "y": 88 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + } + ], + "rectangle": [ + { + "fillColor": { + "r": 210, + "g": 210, + "b": 210 + }, + "fillPattern": "FillPattern.Solid", + "lineThickness": 5, + "borderPattern": "BorderPattern.Raised", + "extent": [ + { + "x": -100, + "y": 100 + }, + { + "x": 100, + "y": -100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid" + } + ], + "ellipse": [ + { + "dynLineColor": { + "color": { + "r": 235, + "g": 235, + "b": 235 + }, + "dynColor": "if y then {0,255,0}\n else {235,235,235}" + }, + "dynFillColor": { + "color": { + "r": 235, + "g": 235, + "b": 235 + }, + "dynColor": "if y then {0,255,0}\n else {235,235,235}" + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 71, + "y": 7 + }, + { + "x": 85, + "y": -7 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 150 + }, + { + "x": 150, + "y": 110 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": -150, + "y": -140 + }, + { + "x": 150, + "y": -110 + } + ], + "textString": "\"%k\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "width": 300, + "height": 290, + "layerRectangles": [ + { + "x": 50, + "y": 50, + "width": 200, + "height": 200, + "hasFill": true, + "fill": "rgb(210,210,210)", + "stroke": "rgb(0,0,0)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 49.08, + "y": 49.08, + "width": 0.92, + "height": 200.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 49.08, + "y": 250, + "width": 200.92, + "height": 0.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 250, + "y": 50, + "width": 0.92, + "height": 200.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50, + "y": 49.08, + "width": 200.92, + "height": 0.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50, + "y": 50, + "width": 1.38, + "height": 200, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50, + "y": 50, + "width": 200, + "height": 1.38, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 249.08, + "y": 50, + "width": 0.92, + "height": 200, + "hasFill": true, + "fill": "rgb(113,111,100)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50, + "y": 249.08, + "width": 200, + "height": 0.92, + "hasFill": true, + "fill": "rgb(113,111,100)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 248.16000000000003, + "y": 50.92, + "width": 0.92, + "height": 198.16, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50.92, + "y": 248.16000000000003, + "width": 198.16, + "height": 0.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolygons": [ + { + "points": "240,220 218,212 218,228 240,220", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,62 62,84 78,84 70,62", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerEllipses": [ + { + "cx": 228, + "cy": 150, + "rx": 7, + "ry": 7, + "hasFill": true, + "fill": "rgb(235,235,235)", + "hasPattern": true, + "stroke": "rgb(235,235,235)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolylines": [ + { + "points": "60,220 222,220", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,84 70,232", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,150 214,150", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "intPolygons": [ + { + "points": "250,160 270,150 250,140", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 19.5, + "xStart": 150, + "yStart": 275, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%k" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 50, + "y": 250 + }, + { + "x": 250, + "y": 50 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\n%k\n\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Logical/Switch.mo", + "within": "Buildings.Controls.OBC.CDL.Logical", + "topClassName": "Buildings.Controls.OBC.CDL.Logical.Switch", + "comment": "Switch between two Real signals", + "defaultName": "\"swi\"", + "public": { + "inputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "u1", + "comment": "Real input signal", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": 60 + }, + { + "x": -100, + "y": 100 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.BooleanInput", + "name": "u2", + "comment": "Boolean switch input signal, if true, y=u1, else y=u3", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -20 + }, + { + "x": -100, + "y": 20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "u3", + "comment": "Real input signal", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -100 + }, + { + "x": -100, + "y": -60 + } + ] + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "y", + "comment": "Real output signal", + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + } + ] + }, + "info": "\n

\nBlock that outputs one of two real input signals based on a boolean input signal.\n

\n

\nIf the input signal u2 is true,\nthe block outputs y = u1.\nOtherwise, it outputs y = u3.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + }, + "graphics": { + "line": [ + { + "points": [ + { + "x": 12, + "y": 0 + }, + { + "x": 100, + "y": 0 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": 0 + }, + { + "x": -40, + "y": 0 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 255 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": -80 + }, + { + "x": -40, + "y": -80 + }, + { + "x": -40, + "y": -80 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -40, + "y": 12 + }, + { + "x": -40, + "y": -12 + } + ], + "color": { + "r": 255, + "g": 0, + "b": 255 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": 80 + }, + { + "x": -38, + "y": 80 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -38, + "y": 80 + }, + { + "x": 6, + "y": 2 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "thickness": 1, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid" + } + ], + "rectangle": [ + { + "fillColor": { + "r": 210, + "g": 210, + "b": 210 + }, + "fillPattern": "FillPattern.Solid", + "lineThickness": 5, + "borderPattern": "BorderPattern.Raised", + "extent": [ + { + "x": -100, + "y": 100 + }, + { + "x": 100, + "y": -100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid" + } + ], + "ellipse": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "pattern": "LinePattern.None", + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 2, + "y": -8 + }, + { + "x": 18, + "y": 8 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + }, + { + "dynLineColor": { + "color": { + "r": 235, + "g": 235, + "b": 235 + }, + "dynColor": "if u2 then {0,255,0}\n else {235,235,235}" + }, + "dynFillColor": { + "color": { + "r": 235, + "g": 235, + "b": 235 + }, + "dynColor": "if u2 then {0,255,0}\n else {235,235,235}" + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -71, + "y": 7 + }, + { + "x": -85, + "y": -7 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 150 + }, + { + "x": 150, + "y": 110 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "width": 300, + "height": 250, + "layerRectangles": [ + { + "x": 50, + "y": 50, + "width": 200, + "height": 200, + "hasFill": true, + "fill": "rgb(210,210,210)", + "stroke": "rgb(0,0,0)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 49.08, + "y": 49.08, + "width": 0.92, + "height": 200.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 49.08, + "y": 250, + "width": 200.92, + "height": 0.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 250, + "y": 50, + "width": 0.92, + "height": 200.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50, + "y": 49.08, + "width": 200.92, + "height": 0.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50, + "y": 50, + "width": 1.38, + "height": 200, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50, + "y": 50, + "width": 200, + "height": 1.38, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 249.08, + "y": 50, + "width": 0.92, + "height": 200, + "hasFill": true, + "fill": "rgb(113,111,100)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50, + "y": 249.08, + "width": 200, + "height": 0.92, + "hasFill": true, + "fill": "rgb(113,111,100)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 248.16000000000003, + "y": 50.92, + "width": 0.92, + "height": 198.16, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "x": 50.92, + "y": 248.16000000000003, + "width": 198.16, + "height": 0.92, + "hasFill": true, + "fill": "rgb(172,168,153)", + "stroke": "none", + "hasStroke": false, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerEllipses": [ + { + "cx": 160, + "cy": 150, + "rx": 8, + "ry": 8, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 72, + "cy": 150, + "rx": 7, + "ry": 7, + "hasFill": true, + "fill": "rgb(235,235,235)", + "hasPattern": true, + "stroke": "rgb(235,235,235)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolylines": [ + { + "points": "162,150 250,150", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "50,150 110,150", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "50,230 110,230 110,230", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "110,138 110,162", + "fill": "none", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "50,70 112,70", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "112,70 156,148", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 1 + } + ], + "intPolygons": [ + { + "points": "30,80 50,70 30,60", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,160 50,150 30,140", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,240 50,230 30,220", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "250,160 270,150 250,140", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 50, + "y": 250 + }, + { + "x": 250, + "y": 50 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Continuous/Line.mo", + "within": "Buildings.Controls.OBC.CDL.Continuous", + "topClassName": "Buildings.Controls.OBC.CDL.Continuous.Line", + "comment": "Output the value of the input x along a line specified by two points", + "defaultName": "\"lin\"", + "public": { + "parameters": [ + { + "className": "Boolean", + "type": "Boolean", + "name": "limitBelow", + "value": "true", + "comment": "If true, limit input u to be no smaller than x1", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + }, + { + "className": "Boolean", + "type": "Boolean", + "name": "limitAbove", + "value": "true", + "comment": "If true, limit input u to be no larger than x2", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + } + ], + "inputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "x1", + "comment": "Support point x1, with x1 < x2", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": 60 + }, + { + "x": -100, + "y": 100 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "f1", + "comment": "Support point f(x1)", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": 20 + }, + { + "x": -100, + "y": 60 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "x2", + "comment": "Support point x2, with x2 > x1", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -60 + }, + { + "x": -100, + "y": -20 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "f2", + "comment": "Support point f(x2)", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -100 + }, + { + "x": -100, + "y": -60 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "u", + "comment": "Independent variable", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -20 + }, + { + "x": -100, + "y": 20 + } + ] + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "y", + "comment": "f(x) along the line specified by (x1, f1) and (x2, f2)", + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + } + ] + }, + "protected": { + "models": [ + { + "className": "Real", + "name": "a", + "comment": "Intercept" + }, + { + "className": "Real", + "name": "b", + "comment": "Slope" + }, + { + "className": "Real", + "name": "xLim", + "comment": "Input value after applying the limits" + } + ] + }, + "info": "\n

\nBlock that outputs y = a + b u,\nwhere\nu is an input\nand the coefficients a and b\nare determined so that the line intercepts the two input points\nspecified by the two points x1 and f1,\nand x2 and f2.\n

\n

\nThe parameters limitBelow and limitAbove\ndetermine whether x1 and x2 are also used\nto limit the input u.\n

\n

\nIf the limits are used, then this block requires x1 < x2.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + }, + "graphics": { + "line": [ + { + "points": [ + { + "x": -46, + "y": 40 + }, + { + "x": 50, + "y": -44 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "thickness": 0.5, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid" + }, + { + "points": [ + { + "x": -80, + "y": -80 + }, + { + "x": -80, + "y": 72 + } + ], + "color": { + "r": 192, + "g": 192, + "b": 192 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -88, + "y": -78 + }, + { + "x": 76, + "y": -78 + } + ], + "color": { + "r": 192, + "g": 192, + "b": 192 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": 80 + }, + { + "x": -64, + "y": 80 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": -64, + "y": 80 + }, + { + "x": -62, + "y": -78 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": 40 + }, + { + "x": -88, + "y": 40 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": -88, + "y": 40 + }, + { + "x": -48, + "y": 40 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": -40 + }, + { + "x": 48, + "y": -36 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": 48, + "y": -36 + }, + { + "x": 50, + "y": -78 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": -80 + }, + { + "x": -38, + "y": -56 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": -38, + "y": -56 + }, + { + "x": 48, + "y": -44 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": 0 + }, + { + "x": -62, + "y": 0 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": -62, + "y": 0 + }, + { + "x": 8, + "y": -8 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": 10, + "y": -8 + }, + { + "x": 52, + "y": -8 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "points": [ + { + "x": 52, + "y": -8 + }, + { + "x": 100, + "y": 0 + } + ], + "color": { + "r": 28, + "g": 108, + "b": 200 + }, + "pattern": "LinePattern.Dot", + "smooth": "Smooth.Bezier", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "thickness": 0.25 + }, + { + "visible": false, + "points": [ + { + "x": 50, + "y": -44 + }, + { + "x": 80, + "y": -70 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "thickness": 0.5, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid" + }, + { + "visible": false, + "points": [ + { + "x": 52, + "y": -44 + }, + { + "x": 86, + "y": -44 + } + ], + "color": { + "r": 238, + "g": 46, + "b": 47 + }, + "thickness": 0.5, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid" + }, + { + "visible": false, + "points": [ + { + "x": -80, + "y": 68 + }, + { + "x": -46, + "y": 40 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "thickness": 0.5, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid" + }, + { + "visible": false, + "points": [ + { + "x": -80, + "y": 40 + }, + { + "x": -46, + "y": 40 + } + ], + "color": { + "r": 238, + "g": 46, + "b": 47 + }, + "thickness": 0.5, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid" + } + ], + "polygon": [ + { + "lineColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 92, + "y": -78 + }, + { + "x": 70, + "y": -70 + }, + { + "x": 70, + "y": -86 + }, + { + "x": 92, + "y": -78 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + }, + { + "lineColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -80, + "y": 92 + }, + { + "x": -88, + "y": 70 + }, + { + "x": -72, + "y": 70 + }, + { + "x": -80, + "y": 92 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + } + ], + "rectangle": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + } + ], + "ellipse": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.None", + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 44, + "y": -38 + }, + { + "x": 56, + "y": -50 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "pattern": "LinePattern.None", + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": 2, + "y": -2 + }, + { + "x": 14, + "y": -14 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.None", + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -52, + "y": 46 + }, + { + "x": -40, + "y": 34 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 110 + }, + { + "x": 150, + "y": 150 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": 226, + "y": 60 + }, + { + "x": 106, + "y": 10 + } + ], + "dynTextString": { + "firstOpt": "\"\"", + "secondOpt": "String(y, leftjustified=false, significantDigits=3)" + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "width": 376, + "height": 250, + "layerRectangles": [ + { + "x": 50, + "y": 50, + "width": 200, + "height": 200, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolygons": [ + { + "points": "242,228 220,220 220,236 242,228", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,58 62,80 78,80 70,58", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerEllipses": [ + { + "cx": 200, + "cy": 194, + "rx": 6, + "ry": 6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 158, + "cy": 158, + "rx": 6, + "ry": 6, + "hasFill": true, + "fill": "rgb(0,0,127)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + }, + { + "cx": 104, + "cy": 110, + "rx": 6, + "ry": 6, + "hasFill": true, + "fill": "rgb(0,0,0)", + "hasPattern": false, + "stroke": null, + "strokeDasharray": null, + "strokeWidth": null + } + ], + "layerPolylines": [ + { + "points": "104,110 200,194", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "70,230 70,78", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "62,228 226,228", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "50,70 86,70", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "86,70 88,228", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "50,110 62,110", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "62,110 102,110", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "50,190 198,186", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "198,186 200,228", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "50,230 112,206", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "112,206 198,194", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "50,150 88,150", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "88,150 158,158", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "160,158 202,158", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "202,158 250,150", + "fill": "none", + "stroke": "rgb(28,108,200)", + "strokeDasharray": "1,2", + "strokeWidth": 0.25 + }, + { + "points": "200,194 230,220", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "202,194 236,194", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "70,82 104,110", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + }, + { + "points": "70,110 104,110", + "fill": "none", + "stroke": "rgb(238,46,47)", + "strokeDasharray": "1,0", + "strokeWidth": 0.5 + } + ], + "intPolygons": [ + { + "points": "30,80 50,70 30,60", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,120 50,110 30,100", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,200 50,190 30,180", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,240 50,230 30,220", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,160 50,150 30,140", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "250,160 270,150 250,140", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 32.5, + "xStart": 316, + "yStart": 115, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 316, + "dy": 0, + "textString": "" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 50, + "y": 250 + }, + { + "x": 250, + "y": 50 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Continuous/Add.mo", + "within": "Buildings.Controls.OBC.CDL.Continuous", + "topClassName": "Buildings.Controls.OBC.CDL.Continuous.Add", + "comment": "Output the sum of the two inputs", + "defaultName": "\"add2\"", + "public": { + "parameters": [ + { + "className": "Real", + "type": "Real", + "name": "k1", + "value": "+1", + "comment": "Gain for input u1", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + }, + { + "className": "Real", + "type": "Real", + "name": "k2", + "value": "+1", + "comment": "Gain for input u2", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + } + ], + "inputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "u1", + "comment": "Connector of Real input signal 1", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": 40 + }, + { + "x": -100, + "y": 80 + } + ] + } + } + }, + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "u2", + "comment": "Connector of Real input signal 2", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -80 + }, + { + "x": -100, + "y": -40 + } + ] + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "y", + "comment": "Connector of Real output signal", + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + } + ] + }, + "info": "\n

\nBlock that outputs y as the weighted sum of the\ntwo input signals u1 and u2,\n

\n
\n    y = k1*u1 + k2*u2;\n
\n

\nwhere k1 and k2 are parameters.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + }, + "graphics": { + "line": [ + { + "points": [ + { + "x": -100, + "y": 60 + }, + { + "x": -74, + "y": 24 + }, + { + "x": -44, + "y": 24 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": -60 + }, + { + "x": -74, + "y": -28 + }, + { + "x": -42, + "y": -28 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": 50, + "y": 0 + }, + { + "x": 100, + "y": 0 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + "rectangle": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + } + ], + "ellipse": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -50, + "y": -50 + }, + { + "x": 50, + "y": 50 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 150 + }, + { + "x": 150, + "y": 110 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "extent": [ + { + "x": -40, + "y": -22 + }, + { + "x": 36, + "y": 46 + } + ], + "textString": "\"+\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "extent": [ + { + "x": -100, + "y": 52 + }, + { + "x": 5, + "y": 92 + } + ], + "textString": "\"%k1\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "extent": [ + { + "x": -100, + "y": -92 + }, + { + "x": 5, + "y": -52 + } + ], + "textString": "\"%k2\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": 226, + "y": 60 + }, + { + "x": 106, + "y": 10 + } + ], + "dynTextString": { + "firstOpt": "\"\"", + "secondOpt": "String(y, leftjustified=false, significantDigits=3)" + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "width": 376, + "height": 250, + "layerRectangles": [ + { + "x": 50, + "y": 50, + "width": 200, + "height": 200, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerEllipses": [ + { + "cx": 150, + "cy": 150, + "rx": 50, + "ry": 50, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolylines": [ + { + "points": "50,90 76,126 106,126", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "50,210 76,178 108,178", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "200,150 250,150", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "intPolygons": [ + { + "points": "30,100 50,90 30,80", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "30,220 50,210 30,200", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "250,160 270,150 250,140", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 44.2, + "xStart": 148, + "yStart": 138, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 148, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 26, + "xStart": 102.5, + "yStart": 78, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 102.5, + "dy": 0, + "textString": "%k1" + } + ] + }, + { + "font": "helvetica", + "fontSize": 26, + "xStart": 102.5, + "yStart": 222, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 102.5, + "dy": 0, + "textString": "%k2" + } + ] + }, + { + "font": "helvetica", + "fontSize": 32.5, + "xStart": 316, + "yStart": 115, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 316, + "dy": 0, + "textString": "" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 50, + "y": 250 + }, + { + "x": 250, + "y": 50 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\n+\n\n\n%k1\n\n\n%k2\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Continuous/AddParameter.mo", + "within": "Buildings.Controls.OBC.CDL.Continuous", + "topClassName": "Buildings.Controls.OBC.CDL.Continuous.AddParameter", + "comment": "Output the sum of an input plus a parameter", + "defaultName": "\"addPar\"", + "public": { + "parameters": [ + { + "className": "Real", + "type": "Real", + "name": "p", + "comment": "Value to be added", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + }, + { + "className": "Real", + "type": "Real", + "name": "k", + "comment": "Gain of input", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + } + ], + "inputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "u", + "comment": "Connector of Real input signal", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -20 + }, + { + "x": -100, + "y": 20 + } + ] + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "y", + "comment": "Connector of Real output signal", + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + } + ] + }, + "info": "\n

\nBlock that outputs y = k u + p,\nwhere k and p are\nparameters and u is an input.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + }, + "graphics": { + "line": [ + { + "points": [ + { + "x": -54, + "y": 66 + }, + { + "x": -28, + "y": 30 + }, + { + "x": 2, + "y": 30 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -100, + "y": 0 + }, + { + "x": 100, + "y": 0 + } + ], + "color": { + "r": 0, + "g": 0, + "b": 127 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + "polygon": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -86, + "y": -36 + }, + { + "x": -86, + "y": 36 + }, + { + "x": -34, + "y": 0 + }, + { + "x": -86, + "y": -36 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + } + ], + "rectangle": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + } + ], + "ellipse": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -12, + "y": -52 + }, + { + "x": 88, + "y": 48 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "startAngle": 0, + "endAngle": 360 + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 110 + }, + { + "x": 150, + "y": 150 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": -122, + "y": 58 + }, + { + "x": -17, + "y": 98 + } + ], + "textString": "\"%p\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": -196, + "y": -84 + }, + { + "x": 104, + "y": -44 + } + ], + "textString": "\"k=%k\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "extent": [ + { + "x": -2, + "y": -22 + }, + { + "x": 74, + "y": 46 + } + ], + "textString": "\"+\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": 226, + "y": 60 + }, + { + "x": 106, + "y": 10 + } + ], + "dynTextString": { + "firstOpt": "\"\"", + "secondOpt": "String(y, leftjustified=false, significantDigits=3)" + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "width": 422, + "height": 250, + "layerRectangles": [ + { + "x": 96, + "y": 50, + "width": 200, + "height": 200, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolygons": [ + { + "points": "110,186 110,114 162,150 110,186", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerEllipses": [ + { + "cx": 234, + "cy": 152, + "rx": 50, + "ry": 50, + "hasFill": true, + "fill": "rgb(255,255,255)", + "hasPattern": true, + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolylines": [ + { + "points": "142,84 168,120 198,120", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "96,150 296,150", + "fill": "none", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "intPolygons": [ + { + "points": "76,160 96,150 76,140", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "296,160 316,150 296,140", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 196, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 196, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 26, + "xStart": 126.5, + "yStart": 72, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 126.5, + "dy": 0, + "textString": "%p" + } + ] + }, + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 214, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "k=%k" + } + ] + }, + { + "font": "helvetica", + "fontSize": 44.2, + "xStart": 232, + "yStart": 138, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 232, + "dy": 0, + "textString": "+" + } + ] + }, + { + "font": "helvetica", + "fontSize": 32.5, + "xStart": 362, + "yStart": 115, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 362, + "dy": 0, + "textString": "" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 96, + "y": 250 + }, + { + "x": 296, + "y": 50 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\n%p\n\n\nk=%k\n\n\n+\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Continuous/Limiter.mo", + "within": "Buildings.Controls.OBC.CDL.Continuous", + "topClassName": "Buildings.Controls.OBC.CDL.Continuous.Limiter", + "comment": "Limit the range of a signal", + "defaultName": "\"lim\"", + "public": { + "parameters": [ + { + "className": "Real", + "type": "Real", + "name": "uMax", + "comment": "Upper limit of input signal", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + }, + { + "className": "Real", + "type": "Real", + "name": "uMin", + "comment": "Lower limit of input signal", + "annotation": { + "dialog": { + "tab": "General", + "group": "Parameters" + } + } + } + ], + "inputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "name": "u", + "comment": "Connector of Real input signal", + "placement": { + "transformation": { + "extent": [ + { + "x": -140, + "y": -20 + }, + { + "x": -100, + "y": 20 + } + ] + } + } + } + ], + "outputs": [ + { + "className": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "name": "y", + "comment": "Connector of Real output signal", + "placement": { + "transformation": { + "extent": [ + { + "x": 100, + "y": -20 + }, + { + "x": 140, + "y": 20 + } + ] + } + } + } + ] + }, + "info": "\n

\nBlock that outputs y = min(uMax, max(uMin, u)),\nwhere\nu is an input\nand\nuMax and uMin are parameters.\n

\n

\nIf uMax < uMin, an error occurs and no output is produced.\n

\n", + "icon": { + "graphics": { + "line": [ + { + "points": [ + { + "x": 0, + "y": -90 + }, + { + "x": 0, + "y": 68 + } + ], + "color": { + "r": 192, + "g": 192, + "b": 192 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -90, + "y": 0 + }, + { + "x": 68, + "y": 0 + } + ], + "color": { + "r": 192, + "g": 192, + "b": 192 + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -80, + "y": -70 + }, + { + "x": -50, + "y": -70 + }, + { + "x": 50, + "y": 70 + }, + { + "x": 80, + "y": 70 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": 50, + "y": 70 + }, + { + "x": 80, + "y": 70 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + }, + { + "points": [ + { + "x": -80, + "y": -70 + }, + { + "x": -50, + "y": -70 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "color": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "thickness": 0.25 + } + ], + "polygon": [ + { + "lineColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 0, + "y": 90 + }, + { + "x": -8, + "y": 68 + }, + { + "x": 8, + "y": 68 + }, + { + "x": 0, + "y": 90 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + }, + { + "lineColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillColor": { + "r": 192, + "g": 192, + "b": 192 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 90, + "y": 0 + }, + { + "x": 68, + "y": -8 + }, + { + "x": 68, + "y": 8 + }, + { + "x": 90, + "y": 0 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25 + } + ], + "rectangle": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "borderPattern": "BorderPattern.None" + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 110 + }, + { + "x": 150, + "y": 150 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -150, + "y": 150 + }, + { + "x": 150, + "y": 110 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": 12, + "y": 72 + }, + { + "x": 94, + "y": 98 + } + ], + "textString": "\"%uMax\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": -100, + "y": -98 + }, + { + "x": -18, + "y": -72 + } + ], + "textString": "\"%uMin\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + }, + { + "lineColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "extent": [ + { + "x": 226, + "y": 60 + }, + { + "x": 106, + "y": 10 + } + ], + "dynTextString": { + "firstOpt": "\"\"", + "secondOpt": "String(y, leftjustified=false, significantDigits=3)" + }, + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + }, + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.1 + } + }, + "svg": { + "icon": { + "items": { + "width": 376, + "height": 250, + "layerRectangles": [ + { + "x": 50, + "y": 50, + "width": 200, + "height": 200, + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "hasStroke": true, + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolygons": [ + { + "points": "150,60 142,82 158,82 150,60", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "240,150 218,158 218,142 240,150", + "hasFill": true, + "fill": "rgb(192,192,192)", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "layerPolylines": [ + { + "points": "150,240 150,82", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "60,150 218,150", + "fill": "none", + "stroke": "rgb(192,192,192)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,220 100,220 200,80 230,80", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "200,80 230,80", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "70,220 100,220", + "fill": "none", + "stroke": "rgb(0,0,0)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "intPolygons": [ + { + "points": "30,160 50,150 30,140", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + }, + { + "points": "250,160 270,150 250,140", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeDasharray": "1,0", + "strokeWidth": 0.25 + } + ], + "hasDots": false, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 26, + "xStart": 150, + "yStart": 20, + "textAnchor": "middle", + "fill": "rgb(0,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 150, + "dy": 0, + "textString": "%name" + } + ] + }, + { + "font": "helvetica", + "fontSize": 16.9, + "xStart": 203, + "yStart": 65, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 203, + "dy": 0, + "textString": "%uMax" + } + ] + }, + { + "font": "helvetica", + "fontSize": 16.9, + "xStart": 91, + "yStart": 235, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 91, + "dy": 0, + "textString": "%uMin" + } + ] + }, + { + "font": "helvetica", + "fontSize": 32.5, + "xStart": 316, + "yStart": 115, + "textAnchor": "middle", + "fill": "rgb(0,0,0)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 316, + "dy": 0, + "textString": "" + } + ] + } + ] + }, + "coordinate": [ + { + "x": 50, + "y": 250 + }, + { + "x": 250, + "y": 50 + } + ], + "initialScale": 0.1, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n%name\n\n\n%name\n\n\n%uMax\n\n\n%uMin\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Interfaces/RealInput.mo", + "within": "Buildings.Controls.OBC.CDL.Interfaces", + "topClassName": "Buildings.Controls.OBC.CDL.Interfaces.RealInput", + "comment": "'input Real' as connector", + "public": { + "models": [ + { + "className": "RealInput", + "basePrefix": "input", + "name": "Real", + "comment": "'input Real' as connector" + } + ] + }, + "info": "\n

\nConnector with one input signal of type Real.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.2 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 0, + "y": 50 + }, + { + "x": 100, + "y": 0 + }, + { + "x": 0, + "y": -50 + } + ] + } + ] + } + }, + "diagram": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.2 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 0, + "y": 50 + }, + { + "x": 100, + "y": 0 + }, + { + "x": 0, + "y": -50 + }, + { + "x": 0, + "y": 50 + } + ] + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "extent": [ + { + "x": -10, + "y": 60 + }, + { + "x": -10, + "y": 85 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "layerPolygons": [ + { + "points": "100,50 200,100 100,150", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeWidth": 0.25, + "strokeDasharray": "1,0" + } + ], + "width": 200, + "height": 200 + }, + "initialScale": 0.2, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "diagram": { + "items": { + "layerPolygons": [ + { + "points": "100,50 200,100 100,150 100,50", + "hasFill": true, + "fill": "rgb(0,0,127)", + "stroke": "rgb(0,0,127)", + "strokeWidth": 0.25, + "strokeDasharray": "1,0" + } + ], + "width": 200, + "height": 200, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 16.25, + "xStart": 71.3125, + "yStart": 27.5, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 71.3125, + "dy": 0, + "textString": "%name" + } + ] + } + ] + }, + "initialScale": 0.2, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n%name\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Interfaces/BooleanInput.mo", + "within": "Buildings.Controls.OBC.CDL.Interfaces", + "topClassName": "Buildings.Controls.OBC.CDL.Interfaces.BooleanInput", + "comment": "'input Boolean' as connector", + "public": { + "models": [ + { + "className": "BooleanInput", + "basePrefix": "input", + "name": "Boolean", + "comment": "'input Boolean' as connector" + } + ] + }, + "info": "\n

\nConnector with one input signal of type Boolean.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.2 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 0, + "y": 50 + }, + { + "x": 100, + "y": 0 + }, + { + "x": 0, + "y": -50 + } + ] + } + ] + } + }, + "diagram": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.2 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": 0, + "y": 50 + }, + { + "x": 100, + "y": 0 + }, + { + "x": 0, + "y": -50 + }, + { + "x": 0, + "y": 50 + } + ] + } + ], + "text": [ + { + "lineColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": -10, + "y": 85 + }, + { + "x": -10, + "y": 60 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "layerPolygons": [ + { + "points": "100,50 200,100 100,150", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeWidth": 0.25, + "strokeDasharray": "1,0" + } + ], + "width": 200, + "height": 200 + }, + "initialScale": 0.2, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "diagram": { + "items": { + "layerPolygons": [ + { + "points": "100,50 200,100 100,150 100,50", + "hasFill": true, + "fill": "rgb(255,0,255)", + "stroke": "rgb(255,0,255)", + "strokeWidth": 0.25, + "strokeDasharray": "1,0" + } + ], + "width": 200, + "height": 200, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 16.25, + "xStart": 71.3125, + "yStart": 27.5, + "textAnchor": "middle", + "fill": "rgb(255,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 71.3125, + "dy": 0, + "textString": "%name" + } + ] + } + ] + }, + "initialScale": 0.2, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n%name\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Interfaces/RealOutput.mo", + "within": "Buildings.Controls.OBC.CDL.Interfaces", + "topClassName": "Buildings.Controls.OBC.CDL.Interfaces.RealOutput", + "comment": "'output Real' as connector", + "public": { + "models": [ + { + "className": "RealOutput", + "basePrefix": "output", + "name": "Real", + "comment": "'output Real' as connector" + } + ] + }, + "info": "\n

\nConnector with one output signal of type Real.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.2 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -100, + "y": 50 + }, + { + "x": 0, + "y": 0 + }, + { + "x": -100, + "y": -50 + } + ] + } + ] + } + }, + "diagram": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.2 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -100, + "y": 50 + }, + { + "x": 0, + "y": 0 + }, + { + "x": -100, + "y": -50 + } + ] + } + ], + "text": [ + { + "lineColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "extent": [ + { + "x": 30, + "y": 60 + }, + { + "x": 30, + "y": 110 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 0, + "g": 0, + "b": 127 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "layerPolygons": [ + { + "points": "0,50 100,100 0,150", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeWidth": 0.25, + "strokeDasharray": "1,0" + } + ], + "width": 200, + "height": 200 + }, + "initialScale": 0.2, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "diagram": { + "items": { + "layerPolygons": [ + { + "points": "0,50 100,100 0,150", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(0,0,127)", + "strokeWidth": 0.25, + "strokeDasharray": "1,0" + } + ], + "width": 200, + "height": 200, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 32.5, + "xStart": 92.625, + "yStart": 15, + "textAnchor": "middle", + "fill": "rgb(0,0,127)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 92.625, + "dy": 0, + "textString": "%name" + } + ] + } + ] + }, + "initialScale": 0.2, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n%name\n\n\n\n\n\n\n\n\n\n\n" + } + } + }, + { + "modelicaFile": "Buildings/Controls/OBC/CDL/Interfaces/BooleanOutput.mo", + "within": "Buildings.Controls.OBC.CDL.Interfaces", + "topClassName": "Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput", + "comment": "'output Boolean' as connector", + "public": { + "models": [ + { + "className": "BooleanOutput", + "basePrefix": "output", + "name": "Boolean", + "comment": "'output Boolean' as connector" + } + ] + }, + "info": "\n

\nConnector with one output signal of type Boolean.\n

\n", + "icon": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.2 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -100, + "y": 50 + }, + { + "x": 0, + "y": 0 + }, + { + "x": -100, + "y": -50 + } + ] + } + ] + } + }, + "diagram": { + "coordinateSystem": { + "extent": [ + { + "x": -100, + "y": -100 + }, + { + "x": 100, + "y": 100 + } + ], + "preserveAspectRatio": true, + "initialScale": 0.2 + }, + "graphics": { + "polygon": [ + { + "lineColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "fillPattern": "FillPattern.Solid", + "points": [ + { + "x": -100, + "y": 50 + }, + { + "x": 0, + "y": 0 + }, + { + "x": -100, + "y": -50 + }, + { + "x": -100, + "y": 50 + } + ] + } + ], + "text": [ + { + "lineColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "extent": [ + { + "x": 30, + "y": 110 + }, + { + "x": 30, + "y": 60 + } + ], + "textString": "\"%name\"", + "visible": true, + "origin": { + "x": 0, + "y": 0 + }, + "rotation": 0, + "fillColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "pattern": "LinePattern.Solid", + "lineThickness": 0.25, + "fontSize": 0, + "fontName": "Arial", + "textColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "horizontalAlignment": "TextAlignment.Center" + } + ] + } + }, + "svg": { + "icon": { + "items": { + "layerPolygons": [ + { + "points": "0,50 100,100 0,150", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(255,0,255)", + "strokeWidth": 0.25, + "strokeDasharray": "1,0" + } + ], + "width": 200, + "height": 200 + }, + "initialScale": 0.2, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + }, + "diagram": { + "items": { + "layerPolygons": [ + { + "points": "0,50 100,100 0,150 0,50", + "hasFill": true, + "fill": "rgb(255,255,255)", + "stroke": "rgb(255,0,255)", + "strokeWidth": 0.25, + "strokeDasharray": "1,0" + } + ], + "width": 200, + "height": 200, + "layerTexts": [ + { + "font": "helvetica", + "fontSize": 32.5, + "xStart": 92.625, + "yStart": 15, + "textAnchor": "middle", + "fill": "rgb(255,0,255)", + "moreLines": false, + "tSpan": [ + { + "xSpan": 92.625, + "dy": 0, + "textString": "%name" + } + ] + } + ] + }, + "initialScale": 0.2, + "preserveAspectRatio": true, + "drawing": "\n\n\n\n\n\n\n\n%name\n\n\n\n\n\n\n\n\n\n\n" + } + } + } +] \ No newline at end of file diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py new file mode 100644 index 00000000..8934eee7 --- /dev/null +++ b/software/verification/verifyCdlSequence.py @@ -0,0 +1,107 @@ +import json +import re +import argparse + +class VerificationTool: + def __init__(self, config_file="config.json"): + with open(config_file, 'r') as fp: + self.config = json.load(fp) + + self.test_list = [] + self.parse_configurations() + self.initialize_tests() + + print(self.test_list) + + def parse_configurations(self): + references = self.config.get('references', []) + default_tolerances = self.config.get('tolerances', None) + default_sampling_rate = self.config.get('sampling', None) + default_model_json_directory = self.config.get('modelJsonDirectory', None) + + for reference in references: + ref_model = reference.get('model', None) + ref_sequence = reference.get('sequence', None) + ref_point_name_mapping = reference.get('pointNameMapping', None) + + if ref_model is None: + raise Exception("missing 'model' keyword for a test") + if ref_sequence is None: + raise Exception("missing 'sequence' keyword for a test") + if ref_point_name_mapping is None: + raise Exception("missing 'pointNameMapping' keyword for a test") + + ref_tolerance = reference.get('tolerances', None) + ref_sampling_rate = reference.get('sampling', None) + ref_model_json_directory = reference.get('modelJsonDirectory', None) + + if ref_tolerance is None: + if default_tolerances is None: + raise Exception( + "missing 'tolerances' for the model: {0} and sequence: {1}".format(ref_model, ref_sequence)) + else: + reference['tolerances'] = default_tolerances + + if ref_sampling_rate is None: + if default_sampling_rate is None: + raise Exception( + "missing 'sampling' for the model: {0} and sequence: {1}".format(ref_model, ref_sequence)) + else: + reference['sampling'] = default_sampling_rate + + if ref_model_json_directory is None: + if default_model_json_directory is None: + raise Exception( + "missing 'modelJsonDirectory' for the model: {0} and sequence: {1}".format(ref_model, + ref_sequence)) + else: + reference['modelJsonDirectory'] = default_model_json_directory + + if not reference['modelJsonDirectory'].endswith('/'): + reference['modelJsonDirectory'] += '/' + + self.test_list.append(reference) + + def initialize_tests(self): + for test in self.test_list: + model_dir = test.get('modelJsonDirectory') + model_name = test.get('model') + sequence_name = test.get('sequence') + json_file_name = model_dir+model_name+'.json' + + with open(json_file_name) as fp: + model_json = json.load(fp) + + public_models = [] + found = False + for json_output in model_json: + if json_output.get('topClassName') == model_name: + found = True + public_models = json_output.get('public', {}).get('models', []) + break + + if not found: + raise Exception( + "cannot find json output of model: {0} in json file: {1}".format(model_name, json_file_name)) + + for public_model in public_models: + if public_model['name'] == sequence_name: + print(public_model) + #TODO: extract io, parameters + print() + + def regex_parser(self, regex, point_list): + r = re.compile(regex) + selected_points = list(filter(r.match, point_list)) + return selected_points + +if __name__ == "__main__": + args_parser = argparse.ArgumentParser() + args_parser.add_argument("-c", "--config", help="config file name") + + args = args_parser.parse_args() + config_file = args.config + + test = VerificationTool(config_file=config_file) + #test.start_test() + From c64f62451bbe105a4e0287f0969c1b25f6a1d90b Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 9 Nov 2020 08:30:22 -0800 Subject: [PATCH 04/17] added code to interface with controller and extract parameters from model --- software/verification/verifyCdlSequence.py | 136 +++++++++++++++++---- 1 file changed, 109 insertions(+), 27 deletions(-) diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index 8934eee7..b67c916a 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -1,17 +1,35 @@ import json import re import argparse +# import pyfunnel +import os +import shutil +import BAC0 class VerificationTool: - def __init__(self, config_file="config.json"): + def __init__(self, config_file="config.json", run_controller=False): with open(config_file, 'r') as fp: self.config = json.load(fp) self.test_list = [] self.parse_configurations() - self.initialize_tests() + self.run_controller = run_controller - print(self.test_list) + if self.run_controller: + self.controller_config = self.config.get('controller', {}) + self.initialize_controller() + + self.execute_tests() + + def initialize_controller(self): + network_address = self.controller_config["network_address"] + device_address = self.controller_config["device_address"] + device_id = self.controller_config["device_id"] + + bacnet = BAC0.connect(ip=network_address) + self.device = BAC0.device(address=device_address, device_id=device_id, network=bacnet) + self.point_properties = self.device.points_properties_df().T + print(self.point_properties) def parse_configurations(self): references = self.config.get('references', []) @@ -31,16 +49,18 @@ def parse_configurations(self): if ref_point_name_mapping is None: raise Exception("missing 'pointNameMapping' keyword for a test") - ref_tolerance = reference.get('tolerances', None) + ref_outputs = reference.get('outputs', None) ref_sampling_rate = reference.get('sampling', None) ref_model_json_directory = reference.get('modelJsonDirectory', None) - if ref_tolerance is None: + if ref_outputs is None: if default_tolerances is None: raise Exception( "missing 'tolerances' for the model: {0} and sequence: {1}".format(ref_model, ref_sequence)) else: - reference['tolerances'] = default_tolerances + def_output = default_tolerances + def_output['variable'] = ref_sequence+".*" + reference['outputs'] = [def_output] if ref_sampling_rate is None: if default_sampling_rate is None: @@ -61,47 +81,109 @@ def parse_configurations(self): reference['modelJsonDirectory'] += '/' self.test_list.append(reference) + print(self.test_list) - def initialize_tests(self): + def execute_tests(self): for test in self.test_list: model_dir = test.get('modelJsonDirectory') model_name = test.get('model') sequence_name = test.get('sequence') json_file_name = model_dir+model_name+'.json' - with open(json_file_name) as fp: - model_json = json.load(fp) - - public_models = [] - found = False - for json_output in model_json: - if json_output.get('topClassName') == model_name: - found = True - public_models = json_output.get('public', {}).get('models', []) - break + test_parameters, test_io = self.extract_io(model=model_name, sequence=sequence_name, json_file=json_file_name) + for param in test_parameters: + print(param.get('name')) - if not found: - raise Exception( - "cannot find json output of model: {0} in json file: {1}".format(model_name, json_file_name)) + for ip in test_io.get('inputs'): + print(ip.get('name')) - for public_model in public_models: - if public_model['name'] == sequence_name: - print(public_model) - #TODO: extract io, parameters - print() + for op in test_io.get('outputs'): + print(op.get('name')) def regex_parser(self, regex, point_list): r = re.compile(regex) selected_points = list(filter(r.match, point_list)) return selected_points + def compare_single_variable(self, cdl_output, actual_output, output_config): + results_dir = os.path.join('.', 'tmp') + os.mkdir(results_dir) + + + for var_config in output_config: + variable = var_config.get('variable') + atolx = var_config.get('atolx', None) + atoly = var_config.get('atoly', None) + rtolx = var_config.get('rtolx', None) + rtoly = var_config.get('rtoly', None) + + pf.compareAndReport( + xReference=cdl_output.index.astype(np.int64) / 1E9, + xTest=actual_output.index.astype(np.int64) / 1E9, + yReference=cdl_output[variable], + yTest=actual_output[variable], + atolx=atolx, + atoly=atoly, + rtolx=rtolx, + rtoly=rtoly, + outputDirectory=results_dir) + error_df = pd.read_csv(os.path.join(results_dir, 'errors.csv')) + assert error_df.y.max() == 0 + shutil.rmtree(results_dir) + + def extract_io(self, model, sequence, json_file): + with open(json_file) as fp: + json_ops = json.load(fp) + + test_model = {} + for json_op in json_ops: + top_class_name = json_op.get('topClassName') + if top_class_name == model: + json_models = json_op.get('public', {}).get('models', []) + for json_model in json_models: + if json_model.get('name', '') == sequence: + test_model = json_model + break + + test_parameter_modifications = test_model.get('modifications') + + if test_model == {}: + raise Exception('could not find sequence in json File') + + test_parameters = {} + test_inputs = {} + test_outputs = {} + + test_model_name = test_model.get('className') + for json_op in json_ops: + top_class_name = json_op.get('topClassName') + if top_class_name == test_model_name: + test_parameters = json_op.get('public', {}).get('parameters', {}) + test_inputs = json_op.get('public', {}).get('inputs', {}) + test_outputs = json_op.get('public', {}).get('outputs', {}) + break + + parameter_list = [] + for parameter in test_parameters: + name = parameter.get('name') + parameter_list.append(name) + + for modification in test_parameter_modifications: + if name == modification.get('name'): + parameter['value'] = modification.get('value') + + test_io = {"inputs": test_inputs, "outputs": test_outputs} + return test_parameters, test_io + if __name__ == "__main__": args_parser = argparse.ArgumentParser() args_parser.add_argument("-c", "--config", help="config file name") + args_parser.add_argument("--run_controller", help="if chosen, the inputs will be set to the controller", default=False, action="store_true") args = args_parser.parse_args() config_file = args.config + run_controller = args.run_controller - test = VerificationTool(config_file=config_file) - #test.start_test() + test = VerificationTool(config_file=config_file, run_controller=run_controller) + # test.start_test() From 3e7365b37ca4e4ee50b2423183010df730885a2c Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 9 Nov 2020 08:38:43 -0800 Subject: [PATCH 05/17] adding example config file --- software/verification/.gitignore | 1 - software/verification/config.json | 29 +++++++++++++++++++++++++++ specification/source/verification.rst | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) delete mode 100644 software/verification/.gitignore create mode 100644 software/verification/config.json diff --git a/software/verification/.gitignore b/software/verification/.gitignore deleted file mode 100644 index d344ba6b..00000000 --- a/software/verification/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config.json diff --git a/software/verification/config.json b/software/verification/config.json new file mode 100644 index 00000000..88d0de51 --- /dev/null +++ b/software/verification/config.json @@ -0,0 +1,29 @@ +{ + "references": [ + { + "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", + "sequence": "setPoiVAV", + "pointNameMapping": "realControllerPointMapping.json" + }, + { + "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", + "sequence": "setPoiVAV1", + "pointNameMapping": "realControllerPointMapping.json", + "outputs": [ + { "atoly": 0.5, "variable": "setPoiVAV1.TSup*" } + ], + "indicators": [ + { "setPoiVAV1.TSup*": [ "fanSta.y" ] } + ], + "sampling": 60 + } + ], + "modelJsonDirectory": "test", + "tolerances": { "rtolx": 0.002, "rtoly": 0.002, "atolx": 10, "atoly": 0 }, + "sampling": 120, + "controller": { + "network_address": "192.168.0.115/24", + "device_address": "192.168.0.227", + "device_id": 240001 + } +} diff --git a/specification/source/verification.rst b/specification/source/verification.rst index 90dfefa5..801e8d33 100644 --- a/specification/source/verification.rst +++ b/specification/source/verification.rst @@ -530,7 +530,7 @@ To verify the sequences of its instances ``setPoiVAV`` and ``setPoiVAV1``, a spe "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", "sequence": "setPoiVAV1", "pointNameMapping": "realControllerPointMapping.json", - "tolerances": [ + "outputs": [ { "atoly": 0.5, "variable": "setPoiVAV1.TSup*" } ], "indicators": [ From a798d2c2c9f2e2d3e700a68e5692f1d0d4306605 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 9 Nov 2020 10:02:13 -0800 Subject: [PATCH 06/17] adding controller code --- software/verification/config.json | 5 +- software/verification/verifyCdlSequence.py | 86 +++++++++++++++++++--- 2 files changed, 78 insertions(+), 13 deletions(-) diff --git a/software/verification/config.json b/software/verification/config.json index 88d0de51..54a5e369 100644 --- a/software/verification/config.json +++ b/software/verification/config.json @@ -3,12 +3,15 @@ { "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", "sequence": "setPoiVAV", - "pointNameMapping": "realControllerPointMapping.json" + "pointNameMapping": "realControllerPointMapping.json", + "run_controller": false, + "controller_output": "real_outputs.csv" }, { "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", "sequence": "setPoiVAV1", "pointNameMapping": "realControllerPointMapping.json", + "run_controller": true, "outputs": [ { "atoly": 0.5, "variable": "setPoiVAV1.TSup*" } ], diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index b67c916a..14791895 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -2,21 +2,22 @@ import re import argparse # import pyfunnel +# from OMPython import OMCSessionZMQ import os import shutil import BAC0 class VerificationTool: - def __init__(self, config_file="config.json", run_controller=False): + def __init__(self, config_file="config.json"): with open(config_file, 'r') as fp: self.config = json.load(fp) self.test_list = [] self.parse_configurations() - self.run_controller = run_controller - if self.run_controller: - self.controller_config = self.config.get('controller', {}) + self.controller_config = self.config.get('controller', {}) + self.real_controller = None + if self.controller_config != {}: self.initialize_controller() self.execute_tests() @@ -27,8 +28,8 @@ def initialize_controller(self): device_id = self.controller_config["device_id"] bacnet = BAC0.connect(ip=network_address) - self.device = BAC0.device(address=device_address, device_id=device_id, network=bacnet) - self.point_properties = self.device.points_properties_df().T + self.real_controller = BAC0.device(address=device_address, device_id=device_id, network=bacnet) + self.point_properties = self.real_controller.points_properties_df().T print(self.point_properties) def parse_configurations(self): @@ -41,6 +42,8 @@ def parse_configurations(self): ref_model = reference.get('model', None) ref_sequence = reference.get('sequence', None) ref_point_name_mapping = reference.get('pointNameMapping', None) + ref_run_controller_flag = reference.get('run_controller', False) + ref_controller_output = reference.get('controller_output', None) if ref_model is None: raise Exception("missing 'model' keyword for a test") @@ -48,6 +51,11 @@ def parse_configurations(self): raise Exception("missing 'sequence' keyword for a test") if ref_point_name_mapping is None: raise Exception("missing 'pointNameMapping' keyword for a test") + if not ref_run_controller_flag and ref_controller_output is None: + raise Exception("missing 'controller_output' keyword for a test") + elif ref_controller_output and self.real_controller is None: + raise Exception("missing 'controller' configuration") + ref_outputs = reference.get('outputs', None) ref_sampling_rate = reference.get('sampling', None) @@ -80,6 +88,9 @@ def parse_configurations(self): if not reference['modelJsonDirectory'].endswith('/'): reference['modelJsonDirectory'] += '/' + if ref_run_controller_flag: + reference['controller'] = self.real_controller + self.test_list.append(reference) print(self.test_list) @@ -88,17 +99,60 @@ def execute_tests(self): model_dir = test.get('modelJsonDirectory') model_name = test.get('model') sequence_name = test.get('sequence') + run_controller = test.get('run_controller') + point_name_mapping = reference.get('pointNameMapping') + sample_rate = reference.get('sampling') + output_config = reference.get('outputs', None) json_file_name = model_dir+model_name+'.json' test_parameters, test_io = self.extract_io(model=model_name, sequence=sequence_name, json_file=json_file_name) + + simulation_output = self.run_cdl_simulation(model=model_name, output_folder=model_dir) + + + param_list = [] for param in test_parameters: - print(param.get('name')) + param_list.append(sequence_name+"."+param.get('name')) + ip_list = [] for ip in test_io.get('inputs'): - print(ip.get('name')) + ip_list.append(sequence_name+"."+ip.get('name')) + op_list = [] for op in test_io.get('outputs'): - print(op.get('name')) + op_list.append(sequence_name+"."+op.get('name')) + + ip_dataframe = simulation_output[ip_list] + op_dataframe = simulation_output[op_list] + + if run_controller: + real_outputs = self.execute_controller(inputs=ip_dataframe, point_name_mapping=point_name_mapping, sample_rate=sample_rate) + + for op in op_dataframe.columns: + self.compare_single_variable(cdl_output=op_dataframe[op], actual_output=real_outputs[op], output_config=output_config) + + + def execute_controller(self, inputs, point_name_mapping, sample_rate): + new_col_list = [] + for col in inputs.columns: + new_col_list.append(point_name_mapping.get(col)) + + ip_df = inputs.copy() + ip_df.columns = new_col_list + + t_start = time.time() + t_now = time.time() - t_start + ops = [] + while t_now <= ip_df.iloc[-1].index.values[0]: + ip_row = ip_df.loc[t_now>=ip_df.index][0] + for ip in ip_row.columns: + self.real_controller[ip] = ip_row[ip] + + ops.append(self.real_controller.points) + time.sleep(sample_rate) + t_now = time.time() - t_start + + return ops def regex_parser(self, regex, point_list): r = re.compile(regex) @@ -175,15 +229,23 @@ def extract_io(self, model, sequence, json_file): test_io = {"inputs": test_inputs, "outputs": test_outputs} return test_parameters, test_io + def run_cdl_simulation(self, model, output_folder): + omc = OMCSessionZMQ() + omc.sendExpression("loadModel(Buildings)") + omc.sendExpression("simulate({}, outputFormat=\"csv\")".format(model)) + # Copy output file + shutil.move("{}_res.csv".format(model), output_folder+"/{}_res.csv".format(model)) + simulation_output = pd.read_csv(output_folder+"/{}_res.csv".format(model), index_col=0) + simulation_output.index = pd.to_datetime(simulation_output.index) + return simulation_output + if __name__ == "__main__": args_parser = argparse.ArgumentParser() args_parser.add_argument("-c", "--config", help="config file name") - args_parser.add_argument("--run_controller", help="if chosen, the inputs will be set to the controller", default=False, action="store_true") args = args_parser.parse_args() config_file = args.config - run_controller = args.run_controller - test = VerificationTool(config_file=config_file, run_controller=run_controller) + test = VerificationTool(config_file=config_file) # test.start_test() From 6421bd052715e8d7d97d18e888be95be0d41fe03 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 16 Nov 2020 00:24:41 -0800 Subject: [PATCH 07/17] fixing typos --- software/verification/verifyCdlSequence.py | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index 14791895..b97fdfe5 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -7,19 +7,21 @@ import shutil import BAC0 +#BACNET has tags in it + class VerificationTool: def __init__(self, config_file="config.json"): with open(config_file, 'r') as fp: self.config = json.load(fp) - self.test_list = [] - self.parse_configurations() - self.controller_config = self.config.get('controller', {}) self.real_controller = None if self.controller_config != {}: self.initialize_controller() + self.test_list = [] + self.parse_configurations() + self.execute_tests() def initialize_controller(self): @@ -100,16 +102,13 @@ def execute_tests(self): model_name = test.get('model') sequence_name = test.get('sequence') run_controller = test.get('run_controller') - point_name_mapping = reference.get('pointNameMapping') - sample_rate = reference.get('sampling') - output_config = reference.get('outputs', None) + point_name_mapping = test.get('pointNameMapping') + sample_rate = test.get('sampling') + output_config = test.get('outputs', None) json_file_name = model_dir+model_name+'.json' test_parameters, test_io = self.extract_io(model=model_name, sequence=sequence_name, json_file=json_file_name) - simulation_output = self.run_cdl_simulation(model=model_name, output_folder=model_dir) - - param_list = [] for param in test_parameters: param_list.append(sequence_name+"."+param.get('name')) @@ -122,11 +121,18 @@ def execute_tests(self): for op in test_io.get('outputs'): op_list.append(sequence_name+"."+op.get('name')) + simulation_output = self.run_cdl_simulation(model=model_name, output_folder=model_dir) + ip_dataframe = simulation_output[ip_list] op_dataframe = simulation_output[op_list] + + if run_controller: real_outputs = self.execute_controller(inputs=ip_dataframe, point_name_mapping=point_name_mapping, sample_rate=sample_rate) + else: + real_outputs = pd.read_csv(reference.get('controller_output'), index_col=0) + real_outputs.index = pd.to_datetime(real_outputs.index) for op in op_dataframe.columns: self.compare_single_variable(cdl_output=op_dataframe[op], actual_output=real_outputs[op], output_config=output_config) From 9d84729a7540ea592436ab3a858397d4719d554f Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 16 Nov 2020 00:57:37 -0800 Subject: [PATCH 08/17] extracting from mat instead of csv --- software/verification/verifyCdlSequence.py | 30 ++++++++++++++++------ 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index b97fdfe5..deb1a903 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -6,6 +6,7 @@ import os import shutil import BAC0 +from buildingspy.io.outputfile import Reader #BACNET has tags in it @@ -121,13 +122,11 @@ def execute_tests(self): for op in test_io.get('outputs'): op_list.append(sequence_name+"."+op.get('name')) - simulation_output = self.run_cdl_simulation(model=model_name, output_folder=model_dir) + simulation_output = self.run_cdl_simulation(model=model_name, output_folder=model_dir, ip_list=ip_list, op_list=op_list) ip_dataframe = simulation_output[ip_list] op_dataframe = simulation_output[op_list] - - if run_controller: real_outputs = self.execute_controller(inputs=ip_dataframe, point_name_mapping=point_name_mapping, sample_rate=sample_rate) else: @@ -235,14 +234,29 @@ def extract_io(self, model, sequence, json_file): test_io = {"inputs": test_inputs, "outputs": test_outputs} return test_parameters, test_io - def run_cdl_simulation(self, model, output_folder): + def run_cdl_simulation(self, model, output_folder, ip_list, op_list): omc = OMCSessionZMQ() omc.sendExpression("loadModel(Buildings)") - omc.sendExpression("simulate({}, outputFormat=\"csv\")".format(model)) + omc.sendExpression("simulate({}, outputFormat=\"mat\")".format(model)) # Copy output file - shutil.move("{}_res.csv".format(model), output_folder+"/{}_res.csv".format(model)) - simulation_output = pd.read_csv(output_folder+"/{}_res.csv".format(model), index_col=0) - simulation_output.index = pd.to_datetime(simulation_output.index) + shutil.move("{}_res.mat".format(model), output_folder+"/{}_res.mat".format(model)) + + r = Reader(output_folder+"/{}_res.mat".format(model), 'dymola') + + df_list = [] + for ip in ip_list: + values = r.values(ip) + df = pd.DataFrame(index=values[0], data={ip: values[1]}) + df_list.concat(df) + for op in op_list: + values = r.values(op) + df = pd.DataFrame(index=values[0], data={op: values[1]}) + df_list.concat(df) + + simulation_output = pd.concat(df_list, axis=1).fillna(method='ffill') + simulation_output.to_csv(output_folder+"/{}_res.csv".format(model)) + simulation_output.index = pd.to_datetime(simulation_output.index).time + return simulation_output if __name__ == "__main__": From 6f3baa82ff61a5456d8813dacbdf361d211abacc Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 1 Feb 2021 09:17:16 -0800 Subject: [PATCH 09/17] adding plots per variable --- software/verification/config.json | 6 +- software/verification/plotter.py | 117 ++++++++++ .../realControllerPointMapping.json | 12 + software/verification/verifyCdlSequence.py | 221 ++++++++++++++---- 4 files changed, 309 insertions(+), 47 deletions(-) create mode 100644 software/verification/plotter.py create mode 100644 software/verification/realControllerPointMapping.json diff --git a/software/verification/config.json b/software/verification/config.json index 54a5e369..7d33119d 100644 --- a/software/verification/config.json +++ b/software/verification/config.json @@ -1,11 +1,11 @@ { "references": [ { - "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", - "sequence": "setPoiVAV", + "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.TerminalUnits.SetPoints.Validation.ZoneTemperatures", + "sequence": "TZonSet", "pointNameMapping": "realControllerPointMapping.json", "run_controller": false, - "controller_output": "real_outputs.csv" + "controller_output": "test/real_outputs.csv" }, { "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", diff --git a/software/verification/plotter.py b/software/verification/plotter.py new file mode 100644 index 00000000..7bcabe90 --- /dev/null +++ b/software/verification/plotter.py @@ -0,0 +1,117 @@ +from plotly.offline import init_notebook_mode, iplot +from plotly import graph_objects as go + + +def verification_plot(output_folder, plot_filename, y_label='Value'): + + data_ref = pd.read_csv(output_folder+'/reference.csv', index_col=0) + data_test = pd.read_csv(output_folder+'/test.csv', index_col=0) + data_err = pd.read_csv(output_folder+'/errors.csv', index_col=0) + data_low = pd.read_csv(output_folder+'/lowerBound.csv', index_col=0) + data_upp = pd.read_csv(output_folder+'/upperBound.csv', index_col=0) + + data = [ + go.Scatter( + x=data_err.index.values, + y=data_err.y.values, + name='Error', + xaxis='x', + yaxis='y2', + line={'width': 5} + ), + go.Scatter( + x=data_test.index.values, + y=data_test.y.values, + name='Controller Output', + line={'width': 5} + ), + go.Scatter( + x=data_low.index.values, + y=data_low.y.values, + showlegend=False, + mode= 'lines', + line={'width': 0} + ), + go.Scatter( + x=data_ref.index.values, + y=data_ref.y.values, + name='CDL Reference Output', + fillcolor='rgba(68, 68, 68, 0.3)', + fill='tonexty', + line={'width': 5} + ), + go.Scatter( + x=data_upp.index.values, + y=data_upp.y.values, + fillcolor='rgba(68, 68, 68, 0.3)', + fill='tonexty', + showlegend=False, + mode= 'lines', + line={'width': 0} + ) + ] + + layout = go.Layout( + legend={ + 'font': { + 'size':24 + }, + 'yanchor': 'top', + 'y': 1.1, + 'xanchor': 'right', + 'x': 0.95 + }, + grid={ + 'rows': 2, + 'columns': 1, + # 'subplots': [['xy1'], ['xy2']] + }, + xaxis1={ + 'ticks': 'outside', + 'showline': True, + 'zeroline': False, + 'title': 'time [seconds]', + 'anchor': 'y1', + 'tickfont': { + 'size': 24, + }, + 'titlefont': { + 'size': 24 + }, + }, + yaxis1= { + 'automargin': True, + 'domain': [0.3, 1], + 'ticks': 'outside', + 'showline': True, + 'zeroline': False, + 'title': { + 'text': y_label, + }, + 'tickfont': { + 'size': 24, + }, + 'titlefont': { + 'size': 24 + }, + }, + yaxis2= { + 'automargin': True, + 'domain': [0, 0.15], + 'ticks': 'outside', + 'showline': True, + 'zeroline': False, + 'title': 'error [y]', + 'tickfont': { + 'size': 24, + }, + 'titlefont': { + 'size': 24 + }, + }, + height=750, + width=1200, + template='plotly_white' + ) + fig = go.Figure(data=data, layout=layout) + fig.write_image(plot_filename) \ No newline at end of file diff --git a/software/verification/realControllerPointMapping.json b/software/verification/realControllerPointMapping.json new file mode 100644 index 00000000..85b50743 --- /dev/null +++ b/software/verification/realControllerPointMapping.json @@ -0,0 +1,12 @@ +{ + "TZonCooSetOcc": {"controller_point": "Occupied Cooling Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, + "TZonHeaSetOcc": {"controller_point": "Occupied Heating Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, + "TZonCooSetUno": {"controller_point": "Unoccupied Cooling Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, + "TZonHeaSetUno": {"controller_point": "Unoccupied Heating Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, + "setAdj": {"controller_point": "setpt_adj_1"}, + "heaSetAdj": {"controller_point": "Heating Adjustment_1"}, + "uOccSen": {"controller_point": "occ_sensor_bni_1", "cdl_unit": "int", "controller_unit": "bool"}, + "uWinSta": {"controller_point": "window_sw_1", "cdl_unit": "int", "controller_unit": "bool"}, + "TZonCooSet": {"controller_point": "Effective Cooling Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, + "TZonHeaSet": {"controller_point": "Effective Heating Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"} +} \ No newline at end of file diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index deb1a903..736f7707 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -1,20 +1,30 @@ import json import re import argparse -# import pyfunnel +import pyfunnel as pf # from OMPython import OMCSessionZMQ +from plotter import verification_plot import os import shutil import BAC0 from buildingspy.io.outputfile import Reader +import pandas as pd +import time +import numpy as np +import datetime -#BACNET has tags in it +#TODO: BACNET has tags in it class VerificationTool: def __init__(self, config_file="config.json"): with open(config_file, 'r') as fp: self.config = json.load(fp) + # TODO: dymola has a flag to specify output interval + # TODO: add documentation + # TODO: find sampling rate + # TODO: maybe use indicator variable's value for reset' + self.controller_config = self.config.get('controller', {}) self.real_controller = None if self.controller_config != {}: @@ -33,7 +43,7 @@ def initialize_controller(self): bacnet = BAC0.connect(ip=network_address) self.real_controller = BAC0.device(address=device_address, device_id=device_id, network=bacnet) self.point_properties = self.real_controller.points_properties_df().T - print(self.point_properties) + # print(self.point_properties) def parse_configurations(self): references = self.config.get('references', []) @@ -95,7 +105,7 @@ def parse_configurations(self): reference['controller'] = self.real_controller self.test_list.append(reference) - print(self.test_list) + # print(self.test_list) def execute_tests(self): for test in self.test_list: @@ -103,7 +113,11 @@ def execute_tests(self): model_name = test.get('model') sequence_name = test.get('sequence') run_controller = test.get('run_controller') - point_name_mapping = test.get('pointNameMapping') + + point_name_mapping_file = test.get('pointNameMapping') + with open(point_name_mapping_file) as fp: + point_name_mapping = json.load(fp) + sample_rate = test.get('sampling') output_config = test.get('outputs', None) json_file_name = model_dir+model_name+'.json' @@ -122,55 +136,161 @@ def execute_tests(self): for op in test_io.get('outputs'): op_list.append(sequence_name+"."+op.get('name')) - simulation_output = self.run_cdl_simulation(model=model_name, output_folder=model_dir, ip_list=ip_list, op_list=op_list) + simulation_output = self.run_cdl_simulation(model=model_name, output_folder=model_dir, ip_list=ip_list, op_list=op_list, sample_time=sample_rate) ip_dataframe = simulation_output[ip_list] op_dataframe = simulation_output[op_list] if run_controller: - real_outputs = self.execute_controller(inputs=ip_dataframe, point_name_mapping=point_name_mapping, sample_rate=sample_rate) + real_outputs = self.execute_controller(inputs=ip_dataframe, op_list=op_list, point_name_mapping=point_name_mapping, sample_rate=sample_rate) + real_outputs.to_csv('test/real_outputs.csv') + print(real_outputs) else: - real_outputs = pd.read_csv(reference.get('controller_output'), index_col=0) - real_outputs.index = pd.to_datetime(real_outputs.index) + real_outputs = pd.read_csv(test.get('controller_output'), index_col=0) - for op in op_dataframe.columns: - self.compare_single_variable(cdl_output=op_dataframe[op], actual_output=real_outputs[op], output_config=output_config) + # TODO: fix sampling + op_dataframe.index = pd.to_datetime(op_dataframe.index, unit='s') + real_outputs.index = pd.to_datetime(real_outputs.index, unit='s') + op_dataframe = op_dataframe.resample('{}S'.format(sample_rate)).mean() + real_outputs = real_outputs.resample('{}S'.format(sample_rate)).mean() - def execute_controller(self, inputs, point_name_mapping, sample_rate): - new_col_list = [] - for col in inputs.columns: - new_col_list.append(point_name_mapping.get(col)) - - ip_df = inputs.copy() - ip_df.columns = new_col_list + validation = True + for op in op_dataframe.columns: + controller_point = point_name_mapping.get(op.split('.')[1], {}).get('controller_point', None) + controller_unit = point_name_mapping.get(op.split('.')[1], {}).get('controller_unit', None) + if controller_point is not None: + print("comparing {}".format(op)) + #TODO: get correct tolerances + validation = validation & self.compare_single_variable(cdl_output=op_dataframe[op], actual_output=real_outputs[op], + output_config=output_config, variable=op, unit=controller_unit) + print("\n") + if validation: + print("SUCCESSFULLY VERIFIED SEQUENCE! ") + + def unit_converter(self, from_unit, to_unit, value): + if from_unit == "degC": + if to_unit == "degK": + return (value + 273.15) + elif to_unit == "degF": + return ((value * 9.0 / 5) + 32) + + if from_unit == "degK": + if to_unit == "degC": + return value - 273.15 + elif to_unit == "degF": + return (((value - 273.15) * 9.0 / 5) + 32) + + if from_unit == "degF": + if to_unit == "degC": + return (value - 32) * 5.0 / 9 + elif to_unit == "degK": + return (value - 32) * 5.0 / 9 + 273.15 + + if from_unit == "int": + if to_unit == "float": + return float(value) + elif to_unit == "bool": + return bool(value) + + if from_unit == "bool": + if to_unit == "int": + return int(value) + + if from_unit == "float": + if to_unit == "int": + return int(value) + + def execute_controller(self, inputs, op_list, point_name_mapping, sample_rate): t_start = time.time() t_now = time.time() - t_start - ops = [] - while t_now <= ip_df.iloc[-1].index.values[0]: - ip_row = ip_df.loc[t_now>=ip_df.index][0] - for ip in ip_row.columns: - self.real_controller[ip] = ip_row[ip] - - ops.append(self.real_controller.points) - time.sleep(sample_rate) + + time_index = [] + ops = {} + while t_now <= inputs.iloc[-1].name: + print("===========================TIME IS {}s".format(round(t_now, 2))) + idx = inputs.loc[t_now>=inputs.index].index.values[-1] + ip_row = inputs.loc[idx] + + for ip in inputs.columns: + cdl_point = ip.split('.')[1] + point_value = ip_row[cdl_point] + controller_point = point_name_mapping.get(cdl_point, {}).get("controller_point", cdl_point) + cdl_unit = point_name_mapping.get(cdl_point, {}).get("cdl_unit", None) + controller_unit = point_name_mapping.get(cdl_point, {}).get("controller_unit", None) + + if cdl_unit is not None and controller_unit is not None: + controller_value = self.unit_converter(from_unit=cdl_unit, to_unit=controller_unit, value=point_value) + print("setting {0} to {1} {2}".format(cdl_point, round(controller_value, 2), controller_unit)) + else: + controller_value = point_value + print("setting {} to {}".format(controller_point, controller_value)) + + self.real_controller[controller_point].write(controller_value, priority=8) + t_now = time.time() - t_start + for op in op_list: + op_var = op.split('.')[1] + controller_point = point_name_mapping.get(op_var, {}).get("controller_point", op_var) + cdl_unit = point_name_mapping.get(op_var, {}).get("cdl_unit", None) + controller_unit = point_name_mapping.get(op_var, {}).get("controller_unit", None) + + controller_value = self.real_controller[controller_point].value + if cdl_unit is not None and controller_unit is not None: + cdl_value = self.unit_converter(from_unit=controller_unit, to_unit=cdl_unit, value=controller_value) + else: + cdl_value = controller_value + + + if op_var not in ops: + ops[op_var] = [cdl_value] + else: + ops[op_var].append(cdl_value) - return ops + time_index.append(t_now) + + time.sleep(2) + t_now = time.time() - t_start + + for op in op_list: + point_name = op_map[op] + value = self.real_controller[point_name].value + ops[op].append(value) + + time_index.append(t_now) + print(time_index) + + op_df = pd.DataFrame(index=time_index, data=ops) + op_df.index.name = 'time' + + return op_df def regex_parser(self, regex, point_list): r = re.compile(regex) selected_points = list(filter(r.match, point_list)) return selected_points - def compare_single_variable(self, cdl_output, actual_output, output_config): - results_dir = os.path.join('.', 'tmp') - os.mkdir(results_dir) + def compare_single_variable(self, cdl_output, actual_output, output_config, variable, unit): + # print("in comparing") + + print("CDL OP:") + ref_op = cdl_output.copy() + ref_op.index = ref_op.index.strftime("%H:%M:%S") + # ref_op = ref_op - 273.15 + print(ref_op.astype(float).round(2)) + + print("\nREAL OP:") + controller_op = actual_output.copy() + controller_op.index = controller_op.index.strftime("%H:%M:%S") + # controller_op = controller_op - 273.15 + print(controller_op.round(decimals=2)) + results_dir = os.path.join('.', 'tmp') + if not os.path.exists(results_dir): + os.mkdir(results_dir) for var_config in output_config: - variable = var_config.get('variable') atolx = var_config.get('atolx', None) atoly = var_config.get('atoly', None) rtolx = var_config.get('rtolx', None) @@ -179,18 +299,27 @@ def compare_single_variable(self, cdl_output, actual_output, output_config): pf.compareAndReport( xReference=cdl_output.index.astype(np.int64) / 1E9, xTest=actual_output.index.astype(np.int64) / 1E9, - yReference=cdl_output[variable], - yTest=actual_output[variable], + yReference=cdl_output, + yTest=actual_output, atolx=atolx, atoly=atoly, rtolx=rtolx, rtoly=rtoly, outputDirectory=results_dir) - error_df = pd.read_csv(os.path.join(results_dir, 'errors.csv')) - assert error_df.y.max() == 0 - shutil.rmtree(results_dir) + verification_plot(output_folder=results_dir, plot_filename='variable.pdf', y_label=variable+" [{}]".format(unit)) + + try: + assert error_df.y.max() == 0 + except: + # TODO: maybe print report and trajectory of this output - when it fails (maybe markdown/html) + print("FAILED assertion for {}".format(variable)) + return False + + return True + # shutil.rmtree(results_dir) def extract_io(self, model, sequence, json_file): + # print("in extract_io") with open(json_file) as fp: json_ops = json.load(fp) @@ -234,12 +363,13 @@ def extract_io(self, model, sequence, json_file): test_io = {"inputs": test_inputs, "outputs": test_outputs} return test_parameters, test_io - def run_cdl_simulation(self, model, output_folder, ip_list, op_list): - omc = OMCSessionZMQ() - omc.sendExpression("loadModel(Buildings)") - omc.sendExpression("simulate({}, outputFormat=\"mat\")".format(model)) + def run_cdl_simulation(self, model, output_folder, ip_list, op_list, sample_time): + # print("in running cdl simulation") + # omc = OMCSessionZMQ() + # omc.sendExpression("loadModel(Buildings)") + # omc.sendExpression("simulate({}, outputFormat=\"mat\")".format(model)) # Copy output file - shutil.move("{}_res.mat".format(model), output_folder+"/{}_res.mat".format(model)) + # shutil.move("{}_res.mat".format(model), output_folder+"/{}_res.mat".format(model)) r = Reader(output_folder+"/{}_res.mat".format(model), 'dymola') @@ -247,15 +377,18 @@ def run_cdl_simulation(self, model, output_folder, ip_list, op_list): for ip in ip_list: values = r.values(ip) df = pd.DataFrame(index=values[0], data={ip: values[1]}) - df_list.concat(df) + df_list.append(df) for op in op_list: values = r.values(op) df = pd.DataFrame(index=values[0], data={op: values[1]}) - df_list.concat(df) + df_list.append(df) simulation_output = pd.concat(df_list, axis=1).fillna(method='ffill') + simulation_output = simulation_output.loc[~simulation_output.index.duplicated(keep='first')] + # simulation_output = simulation_output.drop_duplicates(keep='last') simulation_output.to_csv(output_folder+"/{}_res.csv".format(model)) - simulation_output.index = pd.to_datetime(simulation_output.index).time + simulation_output.index = simulation_output.index.astype(float) + simulation_output.index.name = 'time' return simulation_output From abf47db68ed8adf8eae25049fa1f1798aa1dc609 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 8 Mar 2021 03:03:33 -0800 Subject: [PATCH 10/17] updating point mapping file structure and fixed openmodelica simulation --- .../realControllerPointMapping.json | 54 +++-- software/verification/verifyCdlSequence.py | 188 +++++++++++++----- 2 files changed, 180 insertions(+), 62 deletions(-) diff --git a/software/verification/realControllerPointMapping.json b/software/verification/realControllerPointMapping.json index 85b50743..78479d4e 100644 --- a/software/verification/realControllerPointMapping.json +++ b/software/verification/realControllerPointMapping.json @@ -1,12 +1,42 @@ -{ - "TZonCooSetOcc": {"controller_point": "Occupied Cooling Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, - "TZonHeaSetOcc": {"controller_point": "Occupied Heating Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, - "TZonCooSetUno": {"controller_point": "Unoccupied Cooling Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, - "TZonHeaSetUno": {"controller_point": "Unoccupied Heating Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, - "setAdj": {"controller_point": "setpt_adj_1"}, - "heaSetAdj": {"controller_point": "Heating Adjustment_1"}, - "uOccSen": {"controller_point": "occ_sensor_bni_1", "cdl_unit": "int", "controller_unit": "bool"}, - "uWinSta": {"controller_point": "window_sw_1", "cdl_unit": "int", "controller_unit": "bool"}, - "TZonCooSet": {"controller_point": "Effective Cooling Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"}, - "TZonHeaSet": {"controller_point": "Effective Heating Setpoint_1", "cdl_unit": "degK", "controller_unit": "degF"} -} \ No newline at end of file +[ + { + "cdl": {"name": "TZonCooSetOcc", "unit": "K", "type": "float"}, + "device": {"name": "Occupied Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "TZonHeaSetOcc", "unit": "K", "type": "float"}, + "device": {"name": "Occupied Heating Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "TZonCooSetUno", "unit": "K", "type": "float"}, + "device": {"name": "Unoccupied Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "TZonHeaSetUno", "unit": "K", "type": "float"}, + "device": {"name": "Unoccupied Heating Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "setAdj", "type": "float"}, + "device": {"name": "setpt_adj_1", "type": "float"} + }, + { + "cdl": {"name": "heaSetAdj", "type": "float"}, + "device": {"name": "Heating Adjustment_1", "type": "float"} + }, + { + "cdl": {"name": "uOccSen", "type": "int"}, + "device": {"name": "occ_sensor_bni_1", "type": "bool"} + }, + { + "cdl": {"name": "uWinSta", "type": "int"}, + "device": {"name": "window_sw_1", "type": "bool"} + }, + { + "cdl": {"name": "TZonCooSet", "unit": "K", "type": "float"}, + "device": {"name": "Effective Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "TZonHeaSet", "unit": "K", "type": "float"}, + "device": {"name": "Effective Heating Setpoint_1", "unit": "degF", "type": "float"} + } +] \ No newline at end of file diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index 736f7707..6e4d2eb3 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -2,7 +2,7 @@ import re import argparse import pyfunnel as pf -# from OMPython import OMCSessionZMQ +from OMPython import OMCSessionZMQ from plotter import verification_plot import os import shutil @@ -20,10 +20,11 @@ def __init__(self, config_file="config.json"): with open(config_file, 'r') as fp: self.config = json.load(fp) + # TODO: check unit extracted from modelica-json v/s unit from config # TODO: dymola has a flag to specify output interval # TODO: add documentation # TODO: find sampling rate - # TODO: maybe use indicator variable's value for reset' + # TODO: maybe use indicator variable's value for reset self.controller_config = self.config.get('controller', {}) self.real_controller = None @@ -36,6 +37,7 @@ def __init__(self, config_file="config.json"): self.execute_tests() def initialize_controller(self): + """initialize the real controller.""" network_address = self.controller_config["network_address"] device_address = self.controller_config["device_address"] device_id = self.controller_config["device_id"] @@ -46,6 +48,7 @@ def initialize_controller(self): # print(self.point_properties) def parse_configurations(self): + """parse the configuration file to extract sequences to test, tolerances, point maps and json translations.""" references = self.config.get('references', []) default_tolerances = self.config.get('tolerances', None) default_sampling_rate = self.config.get('sampling', None) @@ -108,6 +111,8 @@ def parse_configurations(self): # print(self.test_list) def execute_tests(self): + """run each test for the particular sequence by running the CDL simulation and then comparing these reference + outputs to outputs generated by the controller in this process or that was archived in a csv file.""" for test in self.test_list: model_dir = test.get('modelJsonDirectory') model_name = test.get('model') @@ -116,7 +121,12 @@ def execute_tests(self): point_name_mapping_file = test.get('pointNameMapping') with open(point_name_mapping_file) as fp: - point_name_mapping = json.load(fp) + point_name_mapping_list = json.load(fp) + + point_name_mapping = {} + for point_dict in point_name_mapping_list: + cdl_name = point_dict["cdl"].get("name") + point_name_mapping[cdl_name] = point_dict sample_rate = test.get('sampling') output_config = test.get('outputs', None) @@ -169,13 +179,36 @@ def execute_tests(self): print("SUCCESSFULLY VERIFIED SEQUENCE! ") def unit_converter(self, from_unit, to_unit, value): + """function to convert values from one unit to another. + + Parameters + ---------- + from_unit : str + what unit is the value in. + to_unit : str + what unit to convert the value to. + value + value to be converted to 'to_unit'. + + Returns + ------- + value + converted value + """ + + if from_unit is None or to_unit is None: + return value + + if from_unit == to_unit: + return value + if from_unit == "degC": - if to_unit == "degK": + if to_unit == "K": return (value + 273.15) elif to_unit == "degF": return ((value * 9.0 / 5) + 32) - if from_unit == "degK": + if from_unit == "K": if to_unit == "degC": return value - 273.15 elif to_unit == "degF": @@ -184,24 +217,53 @@ def unit_converter(self, from_unit, to_unit, value): if from_unit == "degF": if to_unit == "degC": return (value - 32) * 5.0 / 9 - elif to_unit == "degK": + elif to_unit == "K": return (value - 32) * 5.0 / 9 + 273.15 - if from_unit == "int": - if to_unit == "float": + def type_converter(self, from_type, to_type, value): + """function to convert values from one unit to another. + + Parameters + ---------- + from_type : str + what type is the value in. + to_type : str + what type to convert the value to. + value + value to be converted to 'to_type'. + + Returns + ------- + value + converted value + """ + + if from_type == to_type: + return value + + if from_type == "int": + if to_type == "float": return float(value) - elif to_unit == "bool": + elif to_type == "bool": return bool(value) - if from_unit == "bool": - if to_unit == "int": + if from_type == "bool": + if to_type == "int": return int(value) - if from_unit == "float": - if to_unit == "int": + if from_type == "float": + if to_type == "int": return int(value) def execute_controller(self, inputs, op_list, point_name_mapping, sample_rate): + """ + + :param inputs: + :param op_list: + :param point_name_mapping: + :param sample_rate: + :return: + """ t_start = time.time() t_now = time.time() - t_start @@ -214,39 +276,46 @@ def execute_controller(self, inputs, op_list, point_name_mapping, sample_rate): ip_row = inputs.loc[idx] for ip in inputs.columns: - cdl_point = ip.split('.')[1] - point_value = ip_row[cdl_point] - controller_point = point_name_mapping.get(cdl_point, {}).get("controller_point", cdl_point) - cdl_unit = point_name_mapping.get(cdl_point, {}).get("cdl_unit", None) - controller_unit = point_name_mapping.get(cdl_point, {}).get("controller_unit", None) - - if cdl_unit is not None and controller_unit is not None: - controller_value = self.unit_converter(from_unit=cdl_unit, to_unit=controller_unit, value=point_value) - print("setting {0} to {1} {2}".format(cdl_point, round(controller_value, 2), controller_unit)) - else: - controller_value = point_value - print("setting {} to {}".format(controller_point, controller_value)) + cdl_point_name = ip.split('.')[1] + point_value = ip_row[cdl_point_name] + point_cfg = point_name_mapping[cdl_point_name] + + cdl_point_unit = point_cfg.get("cdl").get("unit") + cdl_point_type = point_cfg.get("cdl").get("type") + + device_point_name = point_cfg.get("device").get("name") + device_point_unit = point_cfg.get("device").get("unit") + device_point_type = point_cfg.get("device").get("type") + + device_value = self.unit_converter(from_unit=cdl_point_unit, to_unit=device_point_unit, value=point_value) + device_value = self.type_converter(from_type=cdl_point_type, to_type=device_point_type, value=device_value) - self.real_controller[controller_point].write(controller_value, priority=8) + print("setting cdl: {0}, device; {1} to {2} {3}".format(cdl_point_name, device_point_name, + round(device_value, 2), device_point_unit)) + + self.real_controller[device_point_name].write(device_value, priority=8) t_now = time.time() - t_start for op in op_list: - op_var = op.split('.')[1] - controller_point = point_name_mapping.get(op_var, {}).get("controller_point", op_var) - cdl_unit = point_name_mapping.get(op_var, {}).get("cdl_unit", None) - controller_unit = point_name_mapping.get(op_var, {}).get("controller_unit", None) - - controller_value = self.real_controller[controller_point].value - if cdl_unit is not None and controller_unit is not None: - cdl_value = self.unit_converter(from_unit=controller_unit, to_unit=cdl_unit, value=controller_value) - else: - cdl_value = controller_value + cdl_point_name = op.split('.')[1] + point_cfg = point_name_mapping[cdl_point_name] + + cdl_point_unit = point_cfg.get("cdl").get("unit") + cdl_point_type = point_cfg.get("cdl").get("type") + + device_point_name = point_cfg.get("device").get("name") + device_point_unit = point_cfg.get("device").get("unit") + device_point_type = point_cfg.get("device").get("type") + + device_value = self.real_controller[device_point_name].value + cdl_value = self.unit_converter(from_unit=device_point_unit, to_unit=cdl_point_unit, value=device_value) + cdl_value = self.type_converter(from_type=device_point_type, to_type=cdl_point_type, value=cdl_value) - if op_var not in ops: - ops[op_var] = [cdl_value] + if cdl_point_name not in ops: + ops[cdl_point_name] = [cdl_value] else: - ops[op_var].append(cdl_value) + ops[cdl_point_name].append(cdl_value) time_index.append(t_now) @@ -254,9 +323,22 @@ def execute_controller(self, inputs, op_list, point_name_mapping, sample_rate): t_now = time.time() - t_start for op in op_list: - point_name = op_map[op] - value = self.real_controller[point_name].value - ops[op].append(value) + cdl_point_name = op.split('.')[1] + point_cfg = point_name_mapping[cdl_point_name] + + cdl_point_unit = point_cfg.get("cdl").get("unit") + cdl_point_type = point_cfg.get("cdl").get("type") + + device_point_name = point_cfg.get("device").get("name") + device_point_unit = point_cfg.get("device").get("unit") + device_point_type = point_cfg.get("device").get("type") + + device_value = self.real_controller[device_point_name].value + + cdl_value = self.unit_converter(from_unit=device_point_unit, to_unit=cdl_point_unit, value=device_value) + cdl_value = self.type_converter(from_type=device_point_type, to_type=cdl_point_type, value=cdl_value) + + ops[cdl_point_name].append(cdl_value) time_index.append(t_now) print(time_index) @@ -277,13 +359,11 @@ def compare_single_variable(self, cdl_output, actual_output, output_config, vari print("CDL OP:") ref_op = cdl_output.copy() ref_op.index = ref_op.index.strftime("%H:%M:%S") - # ref_op = ref_op - 273.15 print(ref_op.astype(float).round(2)) print("\nREAL OP:") controller_op = actual_output.copy() controller_op.index = controller_op.index.strftime("%H:%M:%S") - # controller_op = controller_op - 273.15 print(controller_op.round(decimals=2)) results_dir = os.path.join('.', 'tmp') @@ -364,12 +444,20 @@ def extract_io(self, model, sequence, json_file): return test_parameters, test_io def run_cdl_simulation(self, model, output_folder, ip_list, op_list, sample_time): - # print("in running cdl simulation") - # omc = OMCSessionZMQ() - # omc.sendExpression("loadModel(Buildings)") - # omc.sendExpression("simulate({}, outputFormat=\"mat\")".format(model)) - # Copy output file - # shutil.move("{}_res.mat".format(model), output_folder+"/{}_res.mat".format(model)) + print("in running cdl simulation") + omc = OMCSessionZMQ() + if not omc.sendExpression("loadModel(Modelica)"): + err = omc.sendExpression("getErrorString()") + print("error while loading Modelica Standard Library: {}".format(err)) + + if not omc.sendExpression("loadModel(Buildings)"): + err = omc.sendExpression("getErrorString()") + print("error while loading Modelica Buildings Library: {}".format(err)) + + shutil.move("{}_res.mat".format(model), output_folder+"/{}_res.mat".format(model)) + for file in os.listdir('.'): + if file.startswith(model): + os.remove(file) r = Reader(output_folder+"/{}_res.mat".format(model), 'dymola') From b1b17a7a8932b8d2a9c8f35d21d941e5e455ac78 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 8 Mar 2021 03:25:14 -0800 Subject: [PATCH 11/17] adding check to ensure cdl units match in the json translation and point mapping file --- .../verification/realControllerPointMapping.json | 8 ++++---- software/verification/verifyCdlSequence.py | 12 ++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/software/verification/realControllerPointMapping.json b/software/verification/realControllerPointMapping.json index 78479d4e..50b15a55 100644 --- a/software/verification/realControllerPointMapping.json +++ b/software/verification/realControllerPointMapping.json @@ -16,12 +16,12 @@ "device": {"name": "Unoccupied Heating Setpoint_1", "unit": "degF", "type": "float"} }, { - "cdl": {"name": "setAdj", "type": "float"}, - "device": {"name": "setpt_adj_1", "type": "float"} + "cdl": {"name": "setAdj", "unit": "K", "type": "float"}, + "device": {"name": "setpt_adj_1", "unit": "degF", "type": "float"} }, { - "cdl": {"name": "heaSetAdj", "type": "float"}, - "device": {"name": "Heating Adjustment_1", "type": "float"} + "cdl": {"name": "heaSetAdj", "unit": "K", "type": "float"}, + "device": {"name": "Heating Adjustment_1", "unit": "degF", "type": "float"} }, { "cdl": {"name": "uOccSen", "type": "int"}, diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index 6e4d2eb3..b3cbc98c 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -13,14 +13,11 @@ import numpy as np import datetime -#TODO: BACNET has tags in it - class VerificationTool: def __init__(self, config_file="config.json"): with open(config_file, 'r') as fp: self.config = json.load(fp) - # TODO: check unit extracted from modelica-json v/s unit from config # TODO: dymola has a flag to specify output interval # TODO: add documentation # TODO: find sampling rate @@ -140,7 +137,14 @@ def execute_tests(self): ip_list = [] for ip in test_io.get('inputs'): - ip_list.append(sequence_name+"."+ip.get('name')) + ip_name = ip.get('name') + ip_list.append(sequence_name+"."+ip_name) + unit = ip.get("unit", None) + if unit is not None: + unit_from_seq = unit.get('value').split('"')[1] + unit_from_cfg = point_name_mapping[ip_name].get("cdl").get("unit") + if unit_from_cfg != unit_from_seq: + print("CDL units don't match in CDL json file and pointNameMapping json file for {}".format(ip_name)) op_list = [] for op in test_io.get('outputs'): From 68451cbed2fe241ca6ffc40ae2f3090bb9781be1 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 8 Mar 2021 03:50:28 -0800 Subject: [PATCH 12/17] adding documentation for functions --- software/verification/verifyCdlSequence.py | 97 +++++++++++++++++++--- 1 file changed, 87 insertions(+), 10 deletions(-) diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index b3cbc98c..a2ea0633 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -19,7 +19,6 @@ def __init__(self, config_file="config.json"): self.config = json.load(fp) # TODO: dymola has a flag to specify output interval - # TODO: add documentation # TODO: find sampling rate # TODO: maybe use indicator variable's value for reset @@ -260,13 +259,22 @@ def type_converter(self, from_type, to_type, value): return int(value) def execute_controller(self, inputs, op_list, point_name_mapping, sample_rate): - """ + """function that interacts with a real controller device by setting and reading values + + Parameters + ---------- + inputs : pd.DataFrame + timeseries of inputs from the CDL simulation + op_list : list + list of output variables + point_name_mapping : dict + dictionary containing point name, unit and type mapping for each input and output variable + sample_rate : rate at which values are read from the controller - :param inputs: - :param op_list: - :param point_name_mapping: - :param sample_rate: - :return: + Returns + ------- + op_df : pd.DataFrame + timeseries of output values from the controller device based on CDL simulation inputs """ t_start = time.time() @@ -353,12 +361,45 @@ def execute_controller(self, inputs, op_list, point_name_mapping, sample_rate): return op_df def regex_parser(self, regex, point_list): + """function that filters points based on a regular-expression + + Parameters + ---------- + regex : str + regular expression used to filter the necessary points + point_list : list + list containing all elements (points from CDL simulation) + + Returns + ------- + selected_points : list + subset of points after filtering, based on the regex + """ r = re.compile(regex) selected_points = list(filter(r.match, point_list)) return selected_points def compare_single_variable(self, cdl_output, actual_output, output_config, variable, unit): - # print("in comparing") + """compares one output variable from CDL simulation (reference) against controller device generated output, + produces comparison and error charts + + Parameters + ---------- + cdl_output : pd.Series + reference timeseries of an output variable obtained from cdl simulation + actual_output : pd.Series + timeseries of the same output variable obtained from the controller device + output_config : dict + absolute and relative tolerance configuration for the output variable + variable : str + variable name to be added to chart axis label + unit : str + variable unit in CDL to be added to the chart axis label + Returns + ------- + success_failure : bool + True if the actual output is within bounds of the reference output all the time, else False + """ print("CDL OP:") ref_op = cdl_output.copy() @@ -403,6 +444,25 @@ def compare_single_variable(self, cdl_output, actual_output, output_config, vari # shutil.rmtree(results_dir) def extract_io(self, model, sequence, json_file): + """extracts inputs, ouputs and parameters from the json translation of the modelica file for the particular + test sequence + + Parameters + ---------- + model : str + name of the modelica model + sequence : str + name of the sequence being tested within the modelica model + json_file : str + filename of the json translation of the modelica model + Returns + ------- + test_parameters : list + list of parameters extracted from the json file + test_io : dict + dictionary with 2 keys: 'inputs' (input variables for the sequence) and 'ouputs' (output variables + for the sequence) + """ # print("in extract_io") with open(json_file) as fp: json_ops = json.load(fp) @@ -448,6 +508,25 @@ def extract_io(self, model, sequence, json_file): return test_parameters, test_io def run_cdl_simulation(self, model, output_folder, ip_list, op_list, sample_time): + """function that runs the CDL simulation using OpenModelica; also converts the .mat output file to .csv + + Parameters + ---------- + model : str + name of the modelica model + output_folder : str + name of the folder where the generated mat file with the results will be saved + ip_list : list + list of input variables for this model + op_list : list + list of output variables for this model + sample_time : int + sample time in seconds + Returns + ------- + simulation_output : pd.DataFrame + timeseries of input and output variable values from the CDL simulation + """ print("in running cdl simulation") omc = OMCSessionZMQ() if not omc.sendExpression("loadModel(Modelica)"): @@ -477,7 +556,6 @@ def run_cdl_simulation(self, model, output_folder, ip_list, op_list, sample_time simulation_output = pd.concat(df_list, axis=1).fillna(method='ffill') simulation_output = simulation_output.loc[~simulation_output.index.duplicated(keep='first')] - # simulation_output = simulation_output.drop_duplicates(keep='last') simulation_output.to_csv(output_folder+"/{}_res.csv".format(model)) simulation_output.index = simulation_output.index.astype(float) simulation_output.index.name = 'time' @@ -492,5 +570,4 @@ def run_cdl_simulation(self, model, output_folder, ip_list, op_list, sample_time config_file = args.config test = VerificationTool(config_file=config_file) - # test.start_test() From a6387d5541e29d32c00199ba71d15a39ce450f23 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 8 Mar 2021 05:27:10 -0800 Subject: [PATCH 13/17] updated config file structure and enabled indicator variables --- software/verification/config.json | 22 ++-- software/verification/verifyCdlSequence.py | 112 +++++++++++++-------- 2 files changed, 82 insertions(+), 52 deletions(-) diff --git a/software/verification/config.json b/software/verification/config.json index 7d33119d..cd4e72cd 100644 --- a/software/verification/config.json +++ b/software/verification/config.json @@ -1,23 +1,23 @@ { "references": [ { - "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.TerminalUnits.SetPoints.Validation.ZoneTemperatures", - "sequence": "TZonSet", + "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", + "sequence": "setPoiVAV", "pointNameMapping": "realControllerPointMapping.json", "run_controller": false, "controller_output": "test/real_outputs.csv" - }, + }, { - "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", - "sequence": "setPoiVAV1", + "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.TerminalUnits.SetPoints.Validation.ZoneTemperatures", + "sequence": "TZonSet", "pointNameMapping": "realControllerPointMapping.json", "run_controller": true, - "outputs": [ - { "atoly": 0.5, "variable": "setPoiVAV1.TSup*" } - ], - "indicators": [ - { "setPoiVAV1.TSup*": [ "fanSta.y" ] } - ], + "outputs": { + "TZonSet.TZon*": { "atoly": 0.5 } + }, + "indicators": { + "TZonSet.TZon*": [ "uOccSen" ] + }, "sampling": 60 } ], diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index a2ea0633..b125902c 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -20,7 +20,6 @@ def __init__(self, config_file="config.json"): # TODO: dymola has a flag to specify output interval # TODO: find sampling rate - # TODO: maybe use indicator variable's value for reset self.controller_config = self.config.get('controller', {}) self.real_controller = None @@ -68,19 +67,17 @@ def parse_configurations(self): elif ref_controller_output and self.real_controller is None: raise Exception("missing 'controller' configuration") - ref_outputs = reference.get('outputs', None) ref_sampling_rate = reference.get('sampling', None) ref_model_json_directory = reference.get('modelJsonDirectory', None) - if ref_outputs is None: - if default_tolerances is None: - raise Exception( - "missing 'tolerances' for the model: {0} and sequence: {1}".format(ref_model, ref_sequence)) - else: - def_output = default_tolerances - def_output['variable'] = ref_sequence+".*" - reference['outputs'] = [def_output] + if ref_outputs is None and default_tolerances is None: + raise Exception( + "missing 'tolerances' for the model: {0} and sequence: {1}".format(ref_model, ref_sequence)) + elif ref_outputs is None: + reference['outputs'] = {ref_sequence+".*": default_tolerances} + else: + reference['outputs'][ref_sequence + ".*"] = default_tolerances if ref_sampling_rate is None: if default_sampling_rate is None: @@ -104,7 +101,6 @@ def parse_configurations(self): reference['controller'] = self.real_controller self.test_list.append(reference) - # print(self.test_list) def execute_tests(self): """run each test for the particular sequence by running the CDL simulation and then comparing these reference @@ -125,7 +121,8 @@ def execute_tests(self): point_name_mapping[cdl_name] = point_dict sample_rate = test.get('sampling') - output_config = test.get('outputs', None) + tolerance_config = test.get('outputs', None) + indicator_config = test.get('indicators', {}) json_file_name = model_dir+model_name+'.json' test_parameters, test_io = self.extract_io(model=model_name, sequence=sequence_name, json_file=json_file_name) @@ -149,6 +146,28 @@ def execute_tests(self): for op in test_io.get('outputs'): op_list.append(sequence_name+"."+op.get('name')) + output_variable_configurations = {} + for op in op_list: + output_variable_configurations[op] = tolerance_config[sequence_name+'.*'].copy() + + for op_regex in tolerance_config: + if op_regex != sequence_name+".*": + filtered_ops = self.regex_parser(regex=op_regex, point_list=op_list) + for op in filtered_ops: + tol = tolerance_config[op_regex] + for tol_variable in tol: + output_variable_configurations[op][tol_variable] = tol[tol_variable] + + for op in op_list: + output_variable_configurations[op]['indicators'] = indicator_config.get(sequence_name + '.*', []).copy() + + for op_regex in indicator_config: + if op_regex != sequence_name+".*": + filtered_ops = self.regex_parser(regex=op_regex, point_list=op_list) + for op in filtered_ops: + indicators = indicator_config[op_regex] + output_variable_configurations[op]['indicators'] = indicators + simulation_output = self.run_cdl_simulation(model=model_name, output_folder=model_dir, ip_list=ip_list, op_list=op_list, sample_time=sample_rate) ip_dataframe = simulation_output[ip_list] @@ -165,18 +184,29 @@ def execute_tests(self): op_dataframe.index = pd.to_datetime(op_dataframe.index, unit='s') real_outputs.index = pd.to_datetime(real_outputs.index, unit='s') + ip_dataframe = ip_dataframe.resample('{}S'.format(sample_rate)).mean() op_dataframe = op_dataframe.resample('{}S'.format(sample_rate)).mean() real_outputs = real_outputs.resample('{}S'.format(sample_rate)).mean() validation = True for op in op_dataframe.columns: - controller_point = point_name_mapping.get(op.split('.')[1], {}).get('controller_point', None) - controller_unit = point_name_mapping.get(op.split('.')[1], {}).get('controller_unit', None) + device_point_name = point_name_mapping.get(op.split('.')[1], {}).get('device').get("name") + cdl_point_unit = point_name_mapping.get(op.split('.')[1], {}).get('cdl').get("unit") if controller_point is not None: print("comparing {}".format(op)) - #TODO: get correct tolerances - validation = validation & self.compare_single_variable(cdl_output=op_dataframe[op], actual_output=real_outputs[op], - output_config=output_config, variable=op, unit=controller_unit) + + cdl_output = op_dataframe[op] + actual_output = real_outputs[op] + + for indicator_variable in output_variable_configurations[op]['indicators']: + cdl_output = cdl_output * ip_dataframe[indicator_variable] + actual_output = actual_output * ip_dataframe[indicator_variable] + + validation = validation & self.compare_single_variable(cdl_output=cdl_output, + actual_output=actual_output, + output_config=output_variable_configurations[op], + variable=device_point_name, + unit=cdl_point_unit) print("\n") if validation: print("SUCCESSFULLY VERIFIED SEQUENCE! ") @@ -415,30 +445,30 @@ def compare_single_variable(self, cdl_output, actual_output, output_config, vari if not os.path.exists(results_dir): os.mkdir(results_dir) - for var_config in output_config: - atolx = var_config.get('atolx', None) - atoly = var_config.get('atoly', None) - rtolx = var_config.get('rtolx', None) - rtoly = var_config.get('rtoly', None) - - pf.compareAndReport( - xReference=cdl_output.index.astype(np.int64) / 1E9, - xTest=actual_output.index.astype(np.int64) / 1E9, - yReference=cdl_output, - yTest=actual_output, - atolx=atolx, - atoly=atoly, - rtolx=rtolx, - rtoly=rtoly, - outputDirectory=results_dir) - verification_plot(output_folder=results_dir, plot_filename='variable.pdf', y_label=variable+" [{}]".format(unit)) - - try: - assert error_df.y.max() == 0 - except: - # TODO: maybe print report and trajectory of this output - when it fails (maybe markdown/html) - print("FAILED assertion for {}".format(variable)) - return False + atolx = output_config.get('atolx', None) + atoly = output_config.get('atoly', None) + rtolx = output_config.get('rtolx', None) + rtoly = output_config.get('rtoly', None) + + pf.compareAndReport( + xReference=cdl_output.index.astype(np.int64) / 1E9, + xTest=actual_output.index.astype(np.int64) / 1E9, + yReference=cdl_output, + yTest=actual_output, + atolx=atolx, + atoly=atoly, + rtolx=rtolx, + rtoly=rtoly, + outputDirectory=results_dir) + verification_plot(output_folder=results_dir, plot_filename='{}.pdf'.format(variable), + y_label="{0} [{1}]".format(variable, unit)) + + try: + assert error_df.y.max() == 0 + except: + # TODO: maybe print report and trajectory of this output - when it fails (maybe markdown/html) + print("FAILED assertion for {}".format(variable)) + return False return True # shutil.rmtree(results_dir) From 2ae1667c5feb90dcae83db15d7aee2261730907b Mon Sep 17 00:00:00 2001 From: Anand Prakash Date: Mon, 8 Mar 2021 05:28:08 -0800 Subject: [PATCH 14/17] Delete config_template.json --- software/verification/config_template.json | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 software/verification/config_template.json diff --git a/software/verification/config_template.json b/software/verification/config_template.json deleted file mode 100644 index 4e58e3e2..00000000 --- a/software/verification/config_template.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "references": [ - { - "model": "", - "sequence": "", - "pointNameMapping": "" - } - ], - "modelJsonDirectory": "", - "tolerances": { "rtolx": <>, "rtoly": <>, "atolx": <>, "atoly": <> }, - "sampling": <> -} From 24ac859358752a2f682446356f9b1761b2cd4781 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Mon, 8 Mar 2021 05:48:14 -0800 Subject: [PATCH 15/17] updating configuration specification example and description --- software/verification/config.json | 1 + software/verification/verifyCdlSequence.py | 2 +- specification/source/verification.rst | 38 +++++++++++++++------- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/software/verification/config.json b/software/verification/config.json index cd4e72cd..f2689f0e 100644 --- a/software/verification/config.json +++ b/software/verification/config.json @@ -12,6 +12,7 @@ "sequence": "TZonSet", "pointNameMapping": "realControllerPointMapping.json", "run_controller": true, + "controller_output": "test/real_outputs.csv", "outputs": { "TZonSet.TZon*": { "atoly": 0.5 } }, diff --git a/software/verification/verifyCdlSequence.py b/software/verification/verifyCdlSequence.py index b125902c..e22a36ee 100644 --- a/software/verification/verifyCdlSequence.py +++ b/software/verification/verifyCdlSequence.py @@ -175,7 +175,7 @@ def execute_tests(self): if run_controller: real_outputs = self.execute_controller(inputs=ip_dataframe, op_list=op_list, point_name_mapping=point_name_mapping, sample_rate=sample_rate) - real_outputs.to_csv('test/real_outputs.csv') + real_outputs.to_csv(test.get('controller_output', '{0}_real_outputs.csv'.format(sequence_name))) print(real_outputs) else: real_outputs = pd.read_csv(test.get('controller_output'), index_col=0) diff --git a/specification/source/verification.rst b/specification/source/verification.rst index 801e8d33..c58ff7bc 100644 --- a/specification/source/verification.rst +++ b/specification/source/verification.rst @@ -524,23 +524,32 @@ To verify the sequences of its instances ``setPoiVAV`` and ``setPoiVAV1``, a spe { "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", "sequence": "setPoiVAV", - "pointNameMapping": "realControllerPointMapping.json" + "pointNameMapping": "realControllerPointMapping.json", + "run_controller": false, + "controller_output": "test/real_outputs.csv" }, { "model": "Buildings.Controls.OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u", "sequence": "setPoiVAV1", "pointNameMapping": "realControllerPointMapping.json", - "outputs": [ - { "atoly": 0.5, "variable": "setPoiVAV1.TSup*" } - ], - "indicators": [ - { "setPoiVAV1.TSup*": [ "fanSta.y" ] } - ], + "run_controller": true, + "controller_output": "test/real_outputs.csv", + "outputs": { + "setPoiVAV1.TSup*": { "atoly": 0.5 } + }, + "indicators": { + "setPoiVAV1.TSup*": [ "fanSta.y" ] + }, "sampling": 60 } ], "tolerances": { "rtolx": 0.002, "rtoly": 0.002, "atolx": 10, "atoly": 0 }, - "sampling": 120 + "sampling": 120, + "controller": { + "network_address": "192.168.0.115/24", + "device_address": "192.168.0.227", + "device_id": 240001 + } } This specifies two tests, one for the controller ``setPoiVAV`` and one for ``setPoiVAV1``. @@ -548,13 +557,18 @@ This specifies two tests, one for the controller ``setPoiVAV`` and one for ``set input time series and/or parameters are different, and therefore their output time series will be different.) The test for ``setPoiVAV`` will use the globally specified tolerances, and use a sampling rate of :math:`120` seconds. The mapping of the variables to the I/O points of the real controller -is provided in the file ``realControllerPointMapping.json``. -The test for ``setPoiVAV1`` will use different tolerances on each output variable that matches +is provided in the file ``realControllerPointMapping.json``. ``setPoiVAV`` will not run the controller +during the test (as indicated by ``run_controller = false``), but will used the saved results ``test/real_outputs.csv`` +from a previous run. The test for ``setPoiVAV1`` will use different tolerances on each output variable that matches the regular expression ``setPoiVAV1.TSup*``. Moreover, for each variable that matches the regular expression, ``setPoiVAV1.TSup*``, the verification will be suspended whenever ``fanSta.y = false``, and the sampling rate is :math:`60` seconds. This test will also use -``realControllerPointMapping.json`` to map the variables to points of the real controller. -The tolerances ``rtolx`` and ``atolx`` are relative and absolute tolerances in the independent +``realControllerPointMapping.json`` to map the variables to points of the real controller. Additionally, this test +will run the controller in real-time (because ``run_controller = true``) and save the time-series of the output +variables in the file specified by ``controller_output``. The real controller's network configuration can be found +under the ``controller`` section of the configuration where the ``network_address`` is the controller's +BACnet subnet, the ``device_address`` is the controller's IP address and the ``device_id`` is the controller's BACnet +device identifier. The tolerances ``rtolx`` and ``atolx`` are relative and absolute tolerances in the independent variable, e.g., in time, and ``rtoly`` and ``atoly`` are relative and absolute tolerances in the control output variable. From ebd7031622dc8d325bf3b7b1a1d4883296ccf4b9 Mon Sep 17 00:00:00 2001 From: Anand Krishnan Prakash Date: Tue, 9 Mar 2021 10:21:34 -0800 Subject: [PATCH 16/17] updated documentation to include example point map --- specification/source/verification.rst | 61 +++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/specification/source/verification.rst b/specification/source/verification.rst index c58ff7bc..5864aab4 100644 --- a/specification/source/verification.rst +++ b/specification/source/verification.rst @@ -557,10 +557,10 @@ This specifies two tests, one for the controller ``setPoiVAV`` and one for ``set input time series and/or parameters are different, and therefore their output time series will be different.) The test for ``setPoiVAV`` will use the globally specified tolerances, and use a sampling rate of :math:`120` seconds. The mapping of the variables to the I/O points of the real controller -is provided in the file ``realControllerPointMapping.json``. ``setPoiVAV`` will not run the controller -during the test (as indicated by ``run_controller = false``), but will used the saved results ``test/real_outputs.csv`` -from a previous run. The test for ``setPoiVAV1`` will use different tolerances on each output variable that matches -the regular expression ``setPoiVAV1.TSup*``. Moreover, for each variable that matches the regular +is provided in the file ``realControllerPointMapping.json`` (see :numref:`ver_poi_map`). ``setPoiVAV`` will not run +the controller during the test (as indicated by ``run_controller = false``), but will used the saved results +``test/real_outputs.csv`` from a previous run. The test for ``setPoiVAV1`` will use different tolerances on each output +variable that matches the regular expression ``setPoiVAV1.TSup*``. Moreover, for each variable that matches the regular expression, ``setPoiVAV1.TSup*``, the verification will be suspended whenever ``fanSta.y = false``, and the sampling rate is :math:`60` seconds. This test will also use ``realControllerPointMapping.json`` to map the variables to points of the real controller. Additionally, this test @@ -572,6 +572,59 @@ device identifier. The tolerances ``rtolx`` and ``atolx`` are relative and absol variable, e.g., in time, and ``rtoly`` and ``atoly`` are relative and absolute tolerances in the control output variable. +.. code-block:: + :name: ver_poi_map + :caption: Example pointNameMapping file + + [ + { + "cdl": {"name": "TZonCooSetOcc", "unit": "K", "type": "float"}, + "device": {"name": "Occupied Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "TZonHeaSetOcc", "unit": "K", "type": "float"}, + "device": {"name": "Occupied Heating Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "TZonCooSetUno", "unit": "K", "type": "float"}, + "device": {"name": "Unoccupied Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "TZonHeaSetUno", "unit": "K", "type": "float"}, + "device": {"name": "Unoccupied Heating Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "setAdj", "unit": "K", "type": "float"}, + "device": {"name": "setpt_adj_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "heaSetAdj", "unit": "K", "type": "float"}, + "device": {"name": "Heating Adjustment_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "uOccSen", "type": "int"}, + "device": {"name": "occ_sensor_bni_1", "type": "bool"} + }, + { + "cdl": {"name": "uWinSta", "type": "int"}, + "device": {"name": "window_sw_1", "type": "bool"} + }, + { + "cdl": {"name": "TZonCooSet", "unit": "K", "type": "float"}, + "device": {"name": "Effective Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": {"name": "TZonHeaSet", "unit": "K", "type": "float"}, + "device": {"name": "Effective Heating Setpoint_1", "unit": "degF", "type": "float"} + } + ] + +:numref:`ver_poi_map` is an example of the ``pointNameMapping`` file specified the configuration. It is a list of +dictionaries, with each dictionaries having two parts. The ``cdl`` part specifies the ``name``, the ``unit`` and the +``type`` of the point in the CDL sequence and the ``device`` part refers to the information about the corresponding +point in the real controller. The ``type`` refers to the data type of the variable in the specific context (in CDL or +in the actual controller). It should also be noted that some points may not have a unit, but only have a type +(for example, ``uOccSen`` is a CDL point that is 1 if there is occupancy and 0 if there is no occupancy detected). To create test input and output time series, we generate CSV files. This needs to be done for each controller, and we will explain it only for the controller ``setPoiVAV``. From d401727ac689ba3beaa909d885cec249841df2fd Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Mon, 15 Mar 2021 14:40:39 -0700 Subject: [PATCH 17/17] Revised verification section --- specification/source/verification.rst | 140 ++++++++++++++------------ 1 file changed, 77 insertions(+), 63 deletions(-) diff --git a/specification/source/verification.rst b/specification/source/verification.rst index 5864aab4..377f4051 100644 --- a/specification/source/verification.rst +++ b/specification/source/verification.rst @@ -335,14 +335,14 @@ hysteresis offset (see :numref:`fig_alc_hys_par`) and the controller gains .. figure:: img/verification/AlcEikon_OATHysteresis.* :width: 300 px - ALC EIKON outdoor air temperature hysteresis to enable/disable the controller + ALC EIKON outdoor air temperature hysteresis to enable/disable the controller. .. _fig_alc_con_par: .. figure:: img/verification/AlcEikon_PIParameters.* :width: 500 px - ALC EIKON PI controller parameters + ALC EIKON PI controller parameters. We configured the CDL PID controller parameters such that they correspond to the parameters of the @@ -514,6 +514,7 @@ iii. Optionally, a boolean variable in the model that we call an indicator varia For example, consider the validation test `OBC.ASHRAE.G36_PR1.AHUs.SingleZone.VAV.SetPoints.Validation.Supply_u `_. To verify the sequences of its instances ``setPoiVAV`` and ``setPoiVAV1``, a specification may be +as shown in :numref:`sec_ver_spe_tes_set`. .. code-block:: :name: sec_ver_spe_tes_set @@ -553,78 +554,91 @@ To verify the sequences of its instances ``setPoiVAV`` and ``setPoiVAV1``, a spe } This specifies two tests, one for the controller ``setPoiVAV`` and one for ``setPoiVAV1``. -(In this example, ``setPoiVAV`` and ``setPoiVAV1`` happen to be the same sequence, but their -input time series and/or parameters are different, and therefore their output time series will be different.) +In this example, ``setPoiVAV`` and ``setPoiVAV1`` happen to be the same sequence, but their +input time series and/or parameters are different, and therefore their output time series will be different. The test for ``setPoiVAV`` will use the globally specified tolerances, and use a sampling rate of :math:`120` seconds. The mapping of the variables to the I/O points of the real controller -is provided in the file ``realControllerPointMapping.json`` (see :numref:`ver_poi_map`). ``setPoiVAV`` will not run -the controller during the test (as indicated by ``run_controller = false``), but will used the saved results -``test/real_outputs.csv`` from a previous run. The test for ``setPoiVAV1`` will use different tolerances on each output -variable that matches the regular expression ``setPoiVAV1.TSup*``. Moreover, for each variable that matches the regular -expression, ``setPoiVAV1.TSup*``, the verification will be suspended whenever -``fanSta.y = false``, and the sampling rate is :math:`60` seconds. This test will also use -``realControllerPointMapping.json`` to map the variables to points of the real controller. Additionally, this test -will run the controller in real-time (because ``run_controller = true``) and save the time-series of the output -variables in the file specified by ``controller_output``. The real controller's network configuration can be found -under the ``controller`` section of the configuration where the ``network_address`` is the controller's -BACnet subnet, the ``device_address`` is the controller's IP address and the ``device_id`` is the controller's BACnet -device identifier. The tolerances ``rtolx`` and ``atolx`` are relative and absolute tolerances in the independent +is provided in the file ``realControllerPointMapping.json``, shown in :numref:`ver_poi_map`. +The test ``setPoiVAV`` will not run +the controller during the test because of the specification ``run_controller = false``. +Rather, it will use the saved results ``test/real_outputs.csv`` from a previous run. +The test for ``setPoiVAV1`` will use different tolerances on each output +variable that matches the regular expression ``setPoiVAV1.TSup*``. +Moreover, for each variable that matches the regular +expression ``setPoiVAV1.TSup*``, the verification will be suspended whenever +``fanSta.y = false``. The sampling rate is :math:`60` seconds. This test will also use +``realControllerPointMapping.json`` to map the variables to points of the real controller. +Because ``run_controller = true``, this test +will run the controller in real-time and save the time-series of the output +variables in the file specified by ``controller_output``. +The real controller's network configuration can be found +under the ``controller`` section of the configuration. +The ``network_address`` is the controller's +BACnet subnet, the ``device_address`` is the controller's IP address and +the ``device_id`` is the controller's BACnet +device identifier. +The tolerances ``rtolx`` and ``atolx`` are relative and absolute tolerances in the independent variable, e.g., in time, and ``rtoly`` and ``atoly`` are relative and absolute tolerances in the control output variable. .. code-block:: :name: ver_poi_map - :caption: Example pointNameMapping file + :caption: Example ``pointNameMapping`` file. [ - { - "cdl": {"name": "TZonCooSetOcc", "unit": "K", "type": "float"}, - "device": {"name": "Occupied Cooling Setpoint_1", "unit": "degF", "type": "float"} - }, - { - "cdl": {"name": "TZonHeaSetOcc", "unit": "K", "type": "float"}, - "device": {"name": "Occupied Heating Setpoint_1", "unit": "degF", "type": "float"} - }, - { - "cdl": {"name": "TZonCooSetUno", "unit": "K", "type": "float"}, - "device": {"name": "Unoccupied Cooling Setpoint_1", "unit": "degF", "type": "float"} - }, - { - "cdl": {"name": "TZonHeaSetUno", "unit": "K", "type": "float"}, - "device": {"name": "Unoccupied Heating Setpoint_1", "unit": "degF", "type": "float"} - }, - { - "cdl": {"name": "setAdj", "unit": "K", "type": "float"}, - "device": {"name": "setpt_adj_1", "unit": "degF", "type": "float"} - }, - { - "cdl": {"name": "heaSetAdj", "unit": "K", "type": "float"}, - "device": {"name": "Heating Adjustment_1", "unit": "degF", "type": "float"} - }, - { - "cdl": {"name": "uOccSen", "type": "int"}, - "device": {"name": "occ_sensor_bni_1", "type": "bool"} - }, - { - "cdl": {"name": "uWinSta", "type": "int"}, - "device": {"name": "window_sw_1", "type": "bool"} - }, - { - "cdl": {"name": "TZonCooSet", "unit": "K", "type": "float"}, - "device": {"name": "Effective Cooling Setpoint_1", "unit": "degF", "type": "float"} - }, - { - "cdl": {"name": "TZonHeaSet", "unit": "K", "type": "float"}, - "device": {"name": "Effective Heating Setpoint_1", "unit": "degF", "type": "float"} - } + { + "cdl": { "name": "TZonCooSetOcc", "unit": "K", "type": "float"}, + "device": {"name": "Occupied Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": { "name": "TZonHeaSetOcc", "unit": "K", "type": "float"}, + "device": {"name": "Occupied Heating Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": { "name": "TZonCooSetUno", "unit": "K", "type": "float"}, + "device": {"name": "Unoccupied Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": { "name": "TZonHeaSetUno", "unit": "K", "type": "float"}, + "device": {"name": "Unoccupied Heating Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": { "name": "setAdj", "unit": "K", "type": "float"}, + "device": {"name": "setpt_adj_1", "unit": "degF", "type": "float"} + }, + { + "cdl": { "name": "heaSetAdj", "unit": "K", "type": "float"}, + "device": {"name": "Heating Adjustment_1", "unit": "degF", "type": "float"} + }, + { + "cdl": { "name": "uOccSen", "type": "int"}, + "device": {"name": "occ_sensor_bni_1", "type": "bool"} + }, + { + "cdl": { "name": "uWinSta", "type": "int"}, + "device": {"name": "window_sw_1", "type": "bool"} + }, + { + "cdl": { "name": "TZonCooSet", "unit": "K", "type": "float"}, + "device": {"name": "Effective Cooling Setpoint_1", "unit": "degF", "type": "float"} + }, + { + "cdl": { "name": "TZonHeaSet", "unit": "K", "type": "float"}, + "device": {"name": "Effective Heating Setpoint_1", "unit": "degF", "type": "float"} + } ] -:numref:`ver_poi_map` is an example of the ``pointNameMapping`` file specified the configuration. It is a list of -dictionaries, with each dictionaries having two parts. The ``cdl`` part specifies the ``name``, the ``unit`` and the -``type`` of the point in the CDL sequence and the ``device`` part refers to the information about the corresponding -point in the real controller. The ``type`` refers to the data type of the variable in the specific context (in CDL or -in the actual controller). It should also be noted that some points may not have a unit, but only have a type -(for example, ``uOccSen`` is a CDL point that is 1 if there is occupancy and 0 if there is no occupancy detected). +:numref:`ver_poi_map` is an example of the ``pointNameMapping`` file. +It is a list of dictionaries, with each dictionaries having two parts: +The ``cdl`` part specifies the ``name``, the ``unit`` and the +``type`` of the point in the CDL sequence. +Similarly, the ``device`` part specifies this information for the corresponding +point in the real controller. +The ``type`` refers to the data type of the variable in the specific context, i.e., in CDL or +in the actual controller. +It should also be noted that some points may not have a unit, but only have a type. +For example, the input ``uOccSen`` is a CDL point that is 1 if there is occupancy and +0 otherwise. To create test input and output time series, we generate CSV files. This needs to be done for each controller, and we will explain it only for the controller ``setPoiVAV``.