BNA8/.resources/7a2a44cf82e18db43fd3a5a2bc7cdc9a5f3b7bf5be9e4af31fba18095e7335b7

152 lines
4.2 KiB
Plaintext

import csv
import re
import StringIO
reRemoveZeroes = re.compile(r'([^\d])0+([1-9])')
reStartingDashes = re.compile(r'^([^_]+)_([^_]+)')
reChuteDashes = re.compile(r'_CH')
reExtraDashes = re.compile(r'_(\d+)(?=_)')
reUnderscores = re.compile(r'_')
reName = re.compile(r'^(.+?)(<br>|$)')
reStatus = re.compile(r'Status: (.+?)(<br>|$)')
reCount = re.compile(r'Count$')
rePPH = re.compile(r'Pph$')
reCPH = re.compile(r'Cph$')
rePercent = re.compile(r'Percent$')
def prettyName(name, hasDots=True):
# Remove zero padding:
name = reRemoveZeroes.sub(r"\1\2", name)
# Change _ to -:
name = reExtraDashes.sub(r"-\1", reChuteDashes.sub("-CH", reStartingDashes.sub(r"\1-\2", name)))
# Fix device names:
name = reUnderscores.sub("." if hasDots else "-", name)
# Return name:
return name
def prettyTitle(title):
# Convert title:
title = title.replace("_", " ").title()
title = reCount.sub("(#)", title)
title = rePPH.sub("(pph)", title)
title = reCPH.sub("(cph)", title)
title = rePercent.sub("(%)", title)
return title
def extractName(obj):
# Return status:
try:
return reName.search(obj["tooltip"]).group(1)
except:
return "Unknown"
def extractStatus(obj):
# Return status:
try:
return reStatus.search(obj["tooltip"]).group(1)
except:
return "Unknown"
def getRowCount(data):
if hasattr(data, 'getRowCount'):
return data.getRowCount()
else:
return len(data)
def toCSV(headers, rows):
buf = StringIO.StringIO()
writer = csv.writer(buf, delimiter=',')
writer.writerows([headers] + rows)
return buf.getvalue()
def datasetFromJson(json, columns=None):
hasStyling = "value" in json[0].keys()
fields = json[0]["value"].keys() if hasStyling else json[0].keys()
titles = fields
if columns <> None:
fields = columns[0]
titles = columns[1]
# Extract json data into 2D array:
datasetData = []
for row in json:
rowData = []
for field in fields:
cell = row["value"][field] if hasStyling else row[field]
if hasattr(cell, 'value'):
rowData.append(cell.value)
else:
rowData.append(cell)
datasetData.append(rowData)
return toCSV(titles, datasetData)
def datasetFromDataset(data, columns=None):
fields = system.dataset.getColumnHeaders(data)
titles = fields
if columns <> None:
fields = columns[0]
titles = columns[1]
datasetData = [[data.getValueAt(row, col) for col in fields] for row in range(data.getRowCount())]
return toCSV(titles, datasetData)
def datasetFromTable(table):
data = table.props.data
columns = table.props.columns
if len(columns) > 0:
fields = []
titles = []
for col in columns:
if "visible" not in col or col.visible:
fields.append(col.field)
if "header" in col and "title" in col.header and col.header.title not in [None,""]:
titles.append(col.header.title)
else:
titles.append(col.field)
if hasattr(data, 'getValueAt'):
return datasetFromDataset(data, [fields, titles])
else:
return datasetFromJson(data, [fields, titles])
else:
return datasetFrom(data)
def datasetFrom(data):
t = str(type(data))
#system.perspective.print(t)
if "$ArrayWrapper" in t:# == "<type 'com.inductiveautomation.perspective.gateway.script.PropertyTreeScriptWrapper$ArrayWrapper'>":
return datasetFromJson(data)
elif "$SafetyWrapper" in t:
return datasetFromTable(data)
else:
return datasetFromDataset(data)
def datasetToJSON(data):
fields = system.dataset.getColumnHeaders(data)
return [{col:data.getValueAt(row, col) for col in fields} for row in range(data.getRowCount())]
def downloadCSV(data, title):
csv = datasetFrom(data)
# Generate filename:
title = title.lower().replace(" ", "_")
datetime = system.date.format(system.date.now(), "yyyyMMdd_HHmmss")
filename = title + "_" + datetime + ".csv"
# Download:
system.perspective.download(filename, csv)
def getScope():
"""gets the scope that the execution is running in and returns a string indication of which scope
Returns: a string indicating with scope the function is executing in
"""
from com.inductiveautomation.ignition.common.model import ApplicationScope
scope = ApplicationScope.getGlobalScope()
if ApplicationScope.isGateway(scope):
return 'gateway'
if ApplicationScope.isClient(scope):
return 'client'
if ApplicationScope.isDesigner(scope):
return 'designer'