From 6ad1847adc33d678d4c4ccf4b6e3e70bc17ad47e Mon Sep 17 00:00:00 2001 From: guga kakhadze Date: Thu, 26 Jun 2025 17:06:50 +0400 Subject: [PATCH] Modified the alarm row click event to handle the case when alarm comes from the MCM. Now highliting the component is universal and no longer requires params or extra bindings. --- .../style-classes/Highlight/Pulse/style.json | 19 +++++ .../ignition/script-python/utils/code.py | 17 ++-- .../style-classes/Highlight/Pulse/style.json | 18 +++++ .../views/Alarm-Views/RealTime/view.json | 80 +++++++++++++++++-- .../Equipment-Views/Status/view.json | 27 ------- 5 files changed, 121 insertions(+), 40 deletions(-) create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse/style.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse/style.json diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse/style.json new file mode 100644 index 0000000..17f5fde --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse/style.json @@ -0,0 +1,19 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "timingFunction": "ease-in-out", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(255, 255, 0, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(255, 255, 0, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(255, 255, 0, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/ignition/script-python/utils/code.py b/MTN6_SCADA/ignition/script-python/utils/code.py index 29d8067..a8f08cb 100644 --- a/MTN6_SCADA/ignition/script-python/utils/code.py +++ b/MTN6_SCADA/ignition/script-python/utils/code.py @@ -7,13 +7,18 @@ def handleTagHighlight(view, currentValue): splitedTag = str(tag).split("/") deviceName = splitedTag[-1] - system.perspective.print(splitedTag) - - tagCopy = tag + Docked_East_Map = { + "VFD" : "Docked-East-VFD", + "MCM" : "Docked-East-MCM" + } + + Docked_East_View = Docked_East_Map["VFD"] if "PE" in deviceName: tag = "/".join(splitedTag[:2]) + "/Conveyor/" + deviceName[:-3] + "VFD1" - system.perspective.print(tag) + + if "MCM" in deviceName: + Docked_East_View = Docked_East_Map["MCM"] components = view.rootContainer.getChildren() @@ -28,8 +33,8 @@ def handleTagHighlight(view, currentValue): tagPath = tagsList[0] if tag == tagPath: - child.props.params["isHighlighted"] = True - system.perspective.openDock('Docked-East-VFD', params={'tagProps': tagProps}) + child.props.style["classes"] = "Highlight/Pulse" + system.perspective.openDock(Docked_East_View, params={'tagProps': tagProps}) return True return False \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse/style.json new file mode 100644 index 0000000..825d919 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(255, 255, 0, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(255, 255, 0, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(255, 255, 0, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json index 8798b42..8649208 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json @@ -482,7 +482,6 @@ ], "custom": { "priorities": { - "critical": false, "diagnostic": false, "high": false, "low": false, @@ -690,7 +689,7 @@ "component": { "onRowClick": { "config": { - "script": "\tdata \u003d self.props.selection.data\n\tif not data or len(data) !\u003d 1:\n\t return\n\t\n\trow \u003d data[0]\n\tclickedTagPath \u003d row.get(\"FullTag\", \"\")\n\tMCM \u003d row.get(\"Location\", \"\")\n\t\n\tMCM_Pages_Map \u003d {\n\t\t\"MCM01\": \"Detailed-Views/MCM01 Fluid Inbound Merges 1-4\",\n\t\t\"MCM02\": \"Detailed-Views/MCM02 Fluid Inbound Merges 5-7\",\n\t\t\"MCM03\": \"Detailed-Views/MCM03 Non Con\",\n\t\t\"MCM04\": \"Detailed-Views/MCM04 North Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM05\": \"Detailed-Views/MCM05 South Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM06\": \"Detailed-Views/MCM06 Non Con\",\n\t\t\"MCM07\": \"Detailed-Views/MCM07 Bypass\",\n\t}\n\t\n\n\tpage \u003d MCM_Pages_Map.get(MCM)\n\t\n\tif not page:\n\t return\n\t\t\n\tdevice \u003d row.get(\"Device\", \"\")\n\t\n\tif not device or not clickedTagPath:\n\t\treturn\n\n\tindex \u003d clickedTagPath.find(device)\n\tif index \u003d\u003d -1:\n\t\treturn\n\t\n\tpathToDevice \u003d clickedTagPath[:index + len(device)]\n\t\t\n\t# Navigate to target view, passing the tag to highlight\n\tsystem.perspective.navigate(view \u003d page, params \u003d {\u0027highlightTagPath\u0027:pathToDevice})\n\t\n\t\n" + "script": "\tdata \u003d self.props.selection.data\n\tif not data or len(data) !\u003d 1:\n\t return\n\t\n\trow \u003d data[0]\n\tclickedTagPath \u003d row.get(\"FullTag\", \"\")\n\tMCM \u003d row.get(\"Location\", \"\")\n\t\n\tMCM_Pages_Map \u003d {\n\t\t\"MCM01\": \"Detailed-Views/MCM01 Fluid Inbound Merges 1-4\",\n\t\t\"MCM02\": \"Detailed-Views/MCM02 Fluid Inbound Merges 5-7\",\n\t\t\"MCM03\": \"Detailed-Views/MCM03 Non Con\",\n\t\t\"MCM04\": \"Detailed-Views/MCM04 North Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM05\": \"Detailed-Views/MCM05 South Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM06\": \"Detailed-Views/MCM06 Non Con\",\n\t\t\"MCM07\": \"Detailed-Views/MCM07 Bypass\",\n\t}\n\t\n\n\tpage \u003d MCM_Pages_Map.get(MCM)\n\t\n\tif not page:\n\t return\n\t\t\n\tdevice \u003d row.get(\"Device\", \"\")\n\t\n\tif not device or not clickedTagPath:\n\t\treturn\n\n\tpathToDevice \u003d \"\"\n\n#\tcheck for the mcm\n\tif \"MCM\" in device:\n\t\tparts \u003d clickedTagPath.split(\"/\")\n\t\tpathToDevice \u003d \"/\".join(parts[:3])\n\n\telse:\n\t\tindex \u003d clickedTagPath.find(device)\n\t\tif index \u003d\u003d -1:\n\t\t\treturn\n\t\tpathToDevice \u003d clickedTagPath[:index + len(device)]\n\n\t\t\n\t# Navigate to target view, passing the tag to highlight\n\tsystem.perspective.navigate(view \u003d page, params \u003d {\u0027highlightTagPath\u0027:pathToDevice})\n\t\n\t\n" }, "scope": "G", "type": "script" @@ -1588,7 +1587,74 @@ } }, "selection": { - "mode": "multiple interval" + "data": [ + { + "Description": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": "MCM01 - Hello world" + }, + "Device": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": "MCM01" + }, + "Duration": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": "01:05:19" + }, + "FullTag": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": "System/MCM01/MCM01/Beacon_Light" + }, + "ID": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": 12 + }, + "Location": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": "MCM01" + }, + "Priority": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": "High" + }, + "StartTimestamp": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "$": [ + "ts", + 0, + 1750942947091 + ], + "$ts": 1750939070000 + } + }, + "Tag": { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": "MCM01.HMI.Beacon_Light" + } + } + ], + "mode": "multiple interval", + "selectedColumn": "Location", + "selectedRow": 0 } }, "type": "ia.display.table" @@ -3092,7 +3158,7 @@ "$": [ "ts", 192, - 1750866213319 + 1750938073345 ], "$ts": 1750435156149 }, @@ -3100,7 +3166,7 @@ "$": [ "ts", 192, - 1750866213319 + 1750938073345 ], "$ts": 1750436956149 } @@ -4048,7 +4114,7 @@ "$": [ "ts", 192, - 1750866213319 + 1750938073345 ], "$ts": 1750435156149 }, @@ -4056,7 +4122,7 @@ "$": [ "ts", 192, - 1750866213319 + 1750938073345 ], "$ts": 1750436956149 }, diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Status/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Status/view.json index 2e8dcef..4f1fc26 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Status/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Status/view.json @@ -17,7 +17,6 @@ "directionLeft": false, "forceFaultStatus": null, "forceRunningStatus": null, - "isHighlighted": false, "tagProps": [ "System/MCM01/Conveyor/UL1_3_VFD1", "value", @@ -302,10 +301,6 @@ "paramDirection": "input", "persistent": true }, - "params.isHighlighted": { - "paramDirection": "input", - "persistent": true - }, "params.tagProps": { "paramDirection": "inout", "persistent": true @@ -508,28 +503,6 @@ ], "type": "property" } - }, - "props.style.classes": { - "binding": { - "config": { - "expression": "{view.params.isHighlighted}" - }, - "transforms": [ - { - "fallback": "", - "inputType": "scalar", - "mappings": [ - { - "input": true, - "output": "State-Styles/State101" - } - ], - "outputType": "style-list", - "type": "map" - } - ], - "type": "expr" - } } }, "props": {