import re import system reSource = re.compile(r"prov\:([^:]+)\:/tag\:([^:]+)\:") reTagPathProvider = re.compile(r"(\[[^\]]+\])?(.+)") SUBVIEWS = { } def resolveScreenByTagPath(tagPath, defaultOverview="Windows/Graphics/Overview", defaultError=""): try: (provider, path) = reTagPathProvider.findall(tagPath)[0] if provider == None: provider = "[default]" except: return defaultError pathParts = path.split("/") tags = [provider+"/".join(pathParts[:i])+"/Parameters.GoToScreen" for i in range(len(pathParts), 0, -1)] for value in system.tag.readBlocking(tags): if value.quality.isGood(): value = value.getValue() if value not in (None, ""): return value else: return defaultError # Couldn't find a PathToInstance parameter, default to overview: return defaultOverview def resolveScreenBySource(source, defaultOverview="Windows/Graphics/Overview", defaultError=""): try: (provider, path) = reSource.findall(source)[0] tagPath = "["+provider+"]"+path except: return defaultOverview return resolveScreenByTagPath(tagPath, defaultOverview, defaultError) def filterAlarms(screen, alarms): # Only filter if this isn't the overview: if screen <> "Windows/Graphics/Overview": # Lookup views to filter on views = SUBVIEWS.get(screen, [screen]) + [""] # Include any device tags not set up yet for all views badrows = [row for row in range(alarms.getRowCount()) if resolveScreenBySource(alarms.getValueAt(row, "source")) not in views] # Return filtered rows: return system.dataset.deleteRows(alarms, badrows) else: return alarms """ reMCP = re.compile(r"\[([^\]]+)\]") def resolveScreen(location, plctag): conveyor = location.split(".")[0] conveyor_parts = conveyor.split("-") conveyor_num = int(conveyor_parts[1].strip(string.ascii_letters)) if len(conveyor_parts) > 1 and conveyor_parts[1].isalnum() and not conveyor_parts[1].isalpha() else 0 area = conveyor_parts[0] area_num = int(area.strip(string.ascii_letters)) if area.isalnum() and not area.isalpha() else 0 mcp = reMCP.findall(plctag)[0] return "Windows/Graphics/Overview" def filterAlarms(screen, alarms): # Lookup views to filter on views = SUBVIEWS.get(screen, []) # Only filter if there are views we found: if len(views) > 0: badrows = [row for row in range(alarms.getRowCount()) if resolveScreen(alarms.getValueAt(row, "device"), alarms.getValueAt(row, "plctag")) not in views] # Return filtered rows: return system.dataset.deleteRows(alarms, badrows) else: return alarms"""