diff --git a/src/SimNDT/gui/HelperMethods.py b/src/SimNDT/gui/HelperMethods.py new file mode 100644 index 0000000..3aa6f03 --- /dev/null +++ b/src/SimNDT/gui/HelperMethods.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +HelperMethods.py + +Created by Miguel Molero on 2013-08-28. +Copyright (c) 2013 MMolero. All rights reserved. +""" + +import os +from PySide.QtCore import * +from PySide.QtGui import * + +import collections +import re, copy +import numpy as np + + +def sort_nicely(l): + """ + Sort the given list in the way that humans expect. + """ + convert = lambda text: int(text) if text.isdigit() else text + alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] + l.sort(key=alphanum_key) + + +def createAction(parent, text, slot=None, shortcut=None, icon=None, + tip=None, checkable=False, signal="triggered()"): + action = QAction(text, parent) + if icon is not None: + action.setIcon(QIcon(":/%s" % icon)) + if shortcut is not None: + action.setShortcut(shortcut) + if tip is not None: + action.setToolTip(tip) + action.setStatusTip(tip) + if slot is not None: + parent.connect(action, SIGNAL(signal), slot) + if checkable: + action.setCheckable(True) + return action + + +def addActions(target, actions): + if not isinstance(actions, collections.Iterable): + target.addAction(actions) + else: + for action in actions: + if action is None: + target.addSeparator() + else: + target.addAction(action) + + +def addWidgets(target, widgets): + if not isinstance(widgets, collections.Iterable): + target.addWidget(widgets) + else: + for widget in widgets: + target.addWidget(widget) + + +def setEnabled(actions, state): + if not isinstance(actions, collections.Iterable): + actions.setEnabled(state) + else: + for action in actions: + if action is not None: + action.setEnabled(state) + + +def setVisible(target, state): + if not isinstance(target, collections.Iterable): + target.setVisible(state) + else: + for item in target: + if item is not None: + item.setVisible(state) + + +def setText(target, string): + if not isinstance(target, collections.Iterable): + target.setText(string) + else: + for item in target: + if item is not None: + item.setText(string) + + +def clear(target): + if not isinstance(target, collections.Iterable): + target.clear() + else: + for item in target: + item.clear() + + +def is_number(s): + try: + float(s) + return True + except ValueError: + return False + + +def mat2Obj(fromMat, toObj): + for name in fromMat._fieldnames: + value = getattr(fromMat, name) + if hasattr(toObj, name): + # print toObj, name + if isinstance(value, float) or isinstance(value, str) or isinstance(value, int): + setattr(toObj, name, value) + elif isinstance(value, np.ndarray): + if value.size == 1: + setattr(toObj, name, value.item()) + else: + setattr(toObj, name, value) + + return toObj + + +def objWithListstoArrays(obj): + for name in obj._fieldnames: + value = getattr(obj, name) + if isinstance(value, list): + setattr(obj, name, np.array(value)) + + return obj + + +def objWithArraysToLists(obj): + for name in obj._fieldnames: + value = getattr(obj, name) + if isinstance(value, np.ndarray): + setattr(obj, name, value.tolist()) + + return obj + + +def loadDataFromList(data2load, key, Class): + if key in data2load: + target = list() + if isinstance(data2load[key], np.ndarray): + for item in (data2load[key]).tolist(): + _item = copy.deepcopy(mat2Obj(item, Class)) + target.append(_item) + else: + _class = copy.deepcopy(mat2Obj(data2load[key], Class)) + target.append(_class) + + return target + else: + None + + +def loadDataFromListWithLabels(data2load, key, listLabels, listClasses): + if key in data2load: + target = list() + + if isinstance(data2load[key], np.ndarray): + for item in (data2load[key]).tolist(): + for i in range(len(listLabels)): + if item.Name == listLabels[i]: + _class = copy.deepcopy(mat2Obj(item, listClasses[i])) + target.append(_class) + else: + item = data2load[key] + for i in range(len(listLabels)): + if item.Name == listLabels[i]: + _class = copy.deepcopy(mat2Obj(item, listClasses[i])) + target.append(_class) + return target + + else: + None + + +def loadDataWithLabels(data2load, key, listLabels, listClasses): + if key in data2load: + item = data2load[key] + for i in range(len(listLabels)): + if item.Name == listLabels[i]: + target = copy.deepcopy(mat2Obj(item, listClasses[i])) + return target + else: + None