def __init__(self, parent=None, multirow=True): Qt.QFrame.__init__(self, parent) self.setToolTip(self.__help__) self.setLayout(Qt.QGridLayout()) self.api = None self.reader = None self.schema = Qt.QLabel('SCHEMA:') self.attribute = Qt.QLabel('at/tri/bu/te') self.start = Qt.QPushButton('Start') self.stop = Qt.QPushButton('Stop') self.export = Qt.QPushButton('Export') self.archiver = fqt.MenuContexted(Qt.QLabel)('archiver(ID)') multirow = 3 if multirow else 0 self.setTable(multirow) length = 6 self.layout().addWidget(self.schema, 0, 0, 1, 1) self.layout().addWidget(self.attribute, 0, 1, 1, int(length / 2)) self.layout().addWidget(self.table, 1, 0, multirow or 1, length) self.layout().addWidget(self.archiver, multirow + 2, 0, 1, 2) self.layout().addWidget(self.export, multirow + 2, length - 3, 1, 1) self.layout().addWidget(self.start, multirow + 2, length - 2, 1, 1) self.layout().addWidget(self.stop, multirow + 2, length - 1, 1, 1) self.setFrameStyle(self.Panel) self.checkDropSupport() self.setDropEventCallback(self.setModel) self.setModes() self.connect(self.start, Qt.SIGNAL('pressed()'), self.applyModes) self.connect(self.stop, Qt.SIGNAL('pressed()'), self.resetModes) self.connect(self.export, Qt.SIGNAL('pressed()'), lambda s=self: show_history(s.getModel(), {'hdb': 'hdb'}. get(s.getSchema(), '*'), parent=s)) self.connect(self, Qt.SIGNAL('archive'), self.startArchiving) self.connect(self, Qt.SIGNAL('update'), self.setModes)
def initStyle(self,show=False): print 'In AlarmFormula.initStyle(%s)' %(self.obj or self.formula) try: self.org_formula = self.formula self.setChildrenCollapsible(False) self.setOrientation(Qt.Qt.Vertical) ################################################################### upperPanel = Qt.QFrame() #self upperPanel.setLayout(Qt.QGridLayout()) self.insertWidget(0,upperPanel) self.editcb = Qt.QCheckBox('Edit') self.undobt = Qt.QPushButton() self.savebt = Qt.QPushButton() l = Qt.QLabel('Formula:') l.setFont(get_bold_font()) self.tf = fandango.qt.QDropTextEdit() #Qt.QTextBrowser() self.tf.setMinimumHeight(100) if self.obj is not None: self.tf.setClickHook(self.onEdit)#@todo setClickHook stop working for unknown reasons !?!?! self.tf.setReadOnly(True) self.tf.setEnabled(False) self.connect(self.editcb,Qt.SIGNAL('toggled(bool)'),self.onEdit) upperPanel.layout().addWidget(self.editcb,0,4,1,1) self.undobt.setIcon(getThemeIcon('edit-undo')) self.undobt.setToolTip('Undo changes in formula') self.undobt.setEnabled(True) self.connect(self.undobt,Qt.SIGNAL('pressed()'),self.undoEdit) upperPanel.layout().addWidget(self.undobt,0,5,1,1) self.savebt.setIcon(getThemeIcon('media-floppy')) self.savebt.setToolTip('Save Alarm Formula') self.savebt.setEnabled(False) upperPanel.layout().addWidget(self.savebt,0,6,1,1) self.connect(self.savebt,Qt.SIGNAL('pressed()'),self.onSave) upperPanel.layout().addWidget(l,0,0,1,1) upperPanel.layout().addWidget(self.tf,1,0,1,7) ################################################################### lowerPanel,row = Qt.QFrame(),0 #self,2 lowerPanel.setLayout(Qt.QGridLayout()) self.insertWidget(1,lowerPanel) l = Qt.QLabel('Result:') l.setFont(get_bold_font()) lowerPanel.layout().addWidget(l,row,0,1,1) self.tb = Qt.QTextEdit() #tb.setPlainText('Formula:\n\t%s\n\nOutput:\n\t%s'%(test.source,result)) self.tb.setMinimumHeight(50) self.tb.setReadOnly(True) self.redobt = Qt.QPushButton() self.redobt.setIcon(getThemeIcon('view-refresh')) self.redobt.setToolTip('Update result') self.connect(self.redobt,Qt.SIGNAL('pressed()'),self.updateResult) lowerPanel.layout().addWidget(self.redobt,row,6,1,1) lowerPanel.layout().addWidget(self.tb,row+1,0,1,7) ################################################################### #Refresh from formula: if self.formula: self.updateFormula(self.formula) if show: self.show() print 'AlarmFormula.initStyle(%s) finished.'%self.formula except: print traceback.format_exc() print 'Unable to show AlarmFormula(%s)'%self.formula
def setup(self, parent, logger, trend): self.trend = trend or logger.trend self.logger = logger self.setWindowTitle("Reload Archiving") lwidget, lcheck = Qt.QVBoxLayout(), Qt.QHBoxLayout() self.setLayout(lwidget) self._reloadbutton = Qt.QPushButton('Reload Archiving') self.layout().addWidget(self._reloadbutton) self._reloadbutton.connect(self._reloadbutton, Qt.SIGNAL('clicked()'), self.logger.resetBuffers) self._decimatecombo = Qt.QComboBox() self._decimatecombo.addItems([t[0] for t in DECIMATION_MODES]) self._decimatecombo.setCurrentIndex(0) self._nonescheck = Qt.QCheckBox('Remove Nones') self._nonescheck.setChecked(True) self._nonescheck.connect(self._nonescheck, Qt.SIGNAL('toggled(bool)'), self.toggle_nones) self._windowedit = Qt.QLineEdit() self._windowedit.setText('0') dl = Qt.QGridLayout() dl.addWidget(Qt.QLabel('Decimation method:'), 0, 0, 1, 2) dl.addWidget(self._decimatecombo, 0, 3, 1, 2) dl.addWidget(Qt.QLabel('Fixed Period (0=AUTO)'), 1, 0, 1, 1) dl.addWidget(self._windowedit, 1, 1, 1, 1) dl.addWidget(self._nonescheck, 1, 2, 1, 2) self.layout().addLayout(dl)
def onNew(self): w = Qt.QDialog(self.Form) w.setWindowTitle('Add New PyAlarm Device') w.setLayout(Qt.QGridLayout()) server, device = Qt.QLineEdit(w), Qt.QLineEdit(w) server.setText('TEST') device.setText('test/pyalarm/1') w.layout().addWidget(Qt.QLabel('Server Instance'), 0, 0, 1, 1) w.layout().addWidget(server, 0, 1, 1, 1) w.layout().addWidget(Qt.QLabel('Device Name'), 1, 0, 1, 1) w.layout().addWidget(device, 1, 1, 1, 1) doit = Qt.QPushButton('Apply') w.layout().addWidget(doit, 2, 0, 2, 2) def create(s=server, d=device, p=w): try: s, d = str(s.text()), str(d.text()) if '/' not in s: s = 'PyAlarm/%s' % s import fandango.tango as ft ft.add_new_device(s, 'PyAlarm', d) print('%s - %s: created!' % (s, d)) except: traceback.print_exc() self.api.load() p.close() QtCore.QObject.connect(doit, QtCore.SIGNAL("clicked()"), create) w.exec_() self.setDevCombo()
def AlarmsSelector(alarms,text='Choose alarms to modify',): qw = Qt.QDialog() qw.setModal(True) qw.setLayout(Qt.QVBoxLayout()) qw.layout().addWidget(Qt.QLabel(text)) qw.layout().addWidget(Qt.QLabel()) [qw.layout().addWidget(Qt.QCheckBox(a,qw)) for a in alarms] addOkCancelButtons(qw) if qw.exec_(): alarms = [str(c.text()) for c in qw.children() if isinstance(c,Qt.QCheckBox) and c.isChecked()] else: alarms = [] return alarms
def __init__(self, parent=None): Qt.QWidget.__init__(self, parent) self.setLayout(Qt.QHBoxLayout()) self.model = '' self.device = '' self.label = Qt.QLabel() self.label.setFixedWidth(250) self.value = Qt.QLabel() self.value.setFixedWidth(200) self.units = Qt.QLabel() self.units.setFixedWidth(50) self.setWindowTitle('TaurusSingleValue') map(self.layout().addWidget, (self.label, self.value, self.units))
def __init__(self, views=None): if views is None: print('load views from database ...') views = ft.get_class_devices('PanicViewDS') views.append(ft.get_tango_host()) print('ViewChooser(%s)' % views) self.view = '' self.views = fd.dicts.SortedDict() for v in views: if ':' in v: self.views[v] = v else: desc = ft.get_device(v).Description.split('\n')[0] self.views[desc] = v Qt.QDialog.__init__(self, None) #self.setModal(True) self.setWindowTitle('PANIC View Chooser') self.setLayout(Qt.QVBoxLayout()) self.layout().addWidget(Qt.QLabel('Choose an AlarmView')) self.chooser = Qt.QComboBox() self.chooser.addItems(self.views.keys()) self.layout().addWidget(self.chooser) self.button = Qt.QPushButton('Done') self.layout().addWidget(self.button) self.button.connect(self.button, Qt.SIGNAL('pressed()'), self.done) self.button.connect(self.button, Qt.SIGNAL('pressed()'), self.close)
def getAlarmReport(alarm,parent=None): print 'getAlarmReport(%s(%s))'%(type(alarm),alarm) try: if type(alarm) is panic.Alarm: alarm = alarm elif type(alarm) is str: alarm=panic.current()[alarm] else: alarm=str(alarm.path()).split('.',1)[0] details=''#<pre>' details+=str(taurus.Device(alarm.device).command_inout('GenerateReport',[alarm.tag])[0]) #details+='\n\n<a href="'+str(tb.windowTitle())+'">'+str(tb.windowTitle())+'</a>' #details+='</pre>' except: details = "<h2>Unable to get Alarm details from %s/%s </h2>"%(alarm.device,alarm.tag) details += '\n\n'+ '-'*80 +'\n\n'+'<pre>%s</pre>'%traceback.format_exc() widget = Qt.QDialog(parent) widget.setLayout(Qt.QVBoxLayout()) msg = 'Last %s report:'%alarm.tag widget.setWindowTitle(msg) print '%s\n%s'%(msg,details) widget.layout().addWidget(Qt.QLabel(msg)) tb = Qt.QTextBrowser(widget) tb.setPlainText(details) tb.setMinimumWidth(350) widget.layout().addWidget(tb) widget.setMinimumWidth(350) bt = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok,Qt.Qt.Horizontal,widget) widget.layout().addWidget(bt) bt.connect(bt,Qt.SIGNAL("accepted()"),widget.accept) return widget
def initStyle(self): print 'In AttributesPreview.initStyle()' try: self.setLayout(Qt.QGridLayout()) self.redobt = Qt.QPushButton() self.redobt.setIcon(getThemeIcon('view-refresh')) self.redobt.setToolTip('Update result') self.taurusForm=TaurusForm() self.taurusForm.setWithButtons(False) self.taurusForm.setWindowTitle('Preview') self.layout().addWidget(self.redobt,0,6,1,1) self.layout().addWidget(Qt.QLabel('Values of attributes used in the Alarm formula:'),0,0,1,1) self.layout().addWidget(self.taurusForm,1,0,1,7) self.connect(self.redobt,Qt.SIGNAL('pressed()'),self.updateAttributes) except: print traceback.format_exc()
def setupUi(self, USE_SCROLL=False, SHOW_OPTIONS=False, USE_TREND=False): self.setWindowTitle('Tango Finder : Search Attributes and Archiving') self.setLayout(Qt.QVBoxLayout()) self.setMinimumWidth(950) #550) #self.setMinimumHeight(700) self.layout().setAlignment(Qt.Qt.AlignTop) self.browser = Qt.QFrame() self.browser.setLayout(Qt.QVBoxLayout()) self.chooser = Qt.QTabWidget() self.chooser.setTabPosition( self.chooser.West if SHOW_OPTIONS else self.chooser.North) #self.combo = Qt.QComboBox() # Combo used for domains, currently disabled self.searchbar = Qt.QFrame() self.searchbar.setLayout(Qt.QGridLayout()) #self.label = Qt.QLabel('Type a part of device name and a part of attribute name, use "*" or " " as wildcards:') #self.layout().addWidget(self.label) self.ServerFilter = Qt.QLineEdit() self.ServerFilter.setMaximumWidth(250) self.DeviceFilter = fandango.qt.Dropable(Qt.QLineEdit)() self.DeviceFilter.setSupportedMimeTypes( fandango.qt.TAURUS_DEV_MIME_TYPE) self.AttributeFilter = fandango.qt.Dropable(Qt.QLineEdit)() self.AttributeFilter.setSupportedMimeTypes( [fandango.qt.TAURUS_ATTR_MIME_TYPE, fandango.qt.TEXT_MIME_TYPE]) self.update = Qt.QPushButton('Update') self.archivecheck = Qt.QCheckBox("Show archived attributes only") self.archivecheck.setChecked(True) self.searchbar.layout().addWidget( Qt.QLabel( 'Enter Device and Attribute filters using wildcards ' '(e.g. li/ct/plc[0-9]+ / ^stat*$ & !status ) and push Update'), 0, 0, 3, 13) [ self.searchbar.layout().addWidget(o, x, y, h, w) for o, x, y, h, w in ( (Qt.QLabel("Device or Alias:"), 4, 0, 1, 1), (self.DeviceFilter, 4, 1, 1, 4), (Qt.QLabel("Attribute:"), 4, 5, 1, 1), (self.AttributeFilter, 4, 6, 1, 4), (self.update, 4, 10, 1, 1), (self.archivecheck, 4, 11, 1, 2), ) ] if SHOW_OPTIONS: self.options = Qt.QWidget() #self.searchbar self.options.setLayout(Qt.QGridLayout()) separator = lambda x: Qt.QLabel(' ' * x) row = 1 [ self.options.layout().addWidget(o, x, y, h, w) for o, x, y, h, w in ( #separator(120),Qt.QLabel("Options: "),separator(5), (Qt.QLabel("Server: "), row, 0, 1, 1), (self.ServerFilter, row, 1, 1, 4), (Qt.QLabel(''), row, 2, 1, 11)) ] #self.panel = generate_table(load_all_thermocouples('SR14')[-1]) self.optiontab = Qt.QTabWidget() self.optiontab.addTab(self.searchbar, 'Filters') self.optiontab.addTab(self.options, 'Options') self.optiontab.setMaximumHeight(100) self.optiontab.setTabPosition(self.optiontab.North) self.browser.layout().addWidget(self.optiontab) else: self.browser.layout().addWidget(self.searchbar) self.toppan = Qt.QWidget(self) self.toppan.setLayout(Qt.QVBoxLayout()) if USE_SCROLL: print '*' * 30 + ' USE_SCROLL=True ' + '*' * 30 ## TO USE SCROLL, HEADER HAS BEEN SET AS A SEPARATE WIDGET #self.header = QGridTable(self.toppan) #self.header.setHorizontalHeaderLabels(self.LABELS) #self.header.setColumnWidth(0,350) self.headers = [] self.header = Qt.QWidget(self.toppan) self.header.setLayout(Qt.QHBoxLayout()) for l, s in zip(self.LABELS, self.SIZES): ql = Qt.QLabel(l) self.headers.append(ql) #if s is not None: #ql.setFixedWidth(s) #else: #ql.setSizePolicy(Qt.QSizePolicy.MinimumExpanding,Qt.QSizePolicy.Fixed) self.header.layout().addWidget(ql) self.toppan.layout().addWidget(self.header) self._scroll = MyScrollArea(self.toppan) #Qt.QScrollArea(self) self._background = AttributesPanel( self._scroll ) #At least a panel should be kept (never deleted) in background to not crash the worker! self.panel = None self._scroll.setChildrenPanel(self.panel) self._scroll.setWidget(self.panel) self._scroll.setMaximumHeight(700) self.toppan.layout().addWidget(self._scroll) self.attrpanel = self._background else: self.panel = AttributesPanel(self.toppan) self.toppan.layout().addWidget(self.panel) self.attrpanel = self.panel self.toppan.layout().addWidget( Qt.QLabel( 'Drag any attribute from the first column into the trend or any taurus widget you want:' )) self.browser.layout().addWidget(self.toppan) self.chooser.addTab(self.browser, 'Search ...') if USE_TREND: self.split = Qt.QSplitter(Qt.Qt.Vertical) self.split.setHandleWidth(25) self.split.addWidget(self.chooser) from taurus.qt.qtgui.plot import TaurusTrend from PyTangoArchiving.widget.trend import ArchivingTrend, ArchivingTrendWidget self.trend = ArchivingTrendWidget() #TaurusArchivingTrend() self.trend.setUseArchiving(True) self.trend.showLegend(True) self.attrpanel.trend = self.trend if TaurusModelChooser is not None: self.treemodel = TaurusModelChooser(parent=self.chooser) self.chooser.addTab(self.treemodel, 'Tree') self.treemodel.updateModels.connect(self.trend.addModels) #self.treemodel.connect(self.treemodel,Qt.SIGNAL('updateModels'),self.trend.addModels) else: tracer('TaurusModelChooser not available!') self.split.addWidget(self.trend) self.layout().addWidget(self.split) else: self.layout().addWidget(self.chooser) type(self)._persistent_ = self
def __init__(self, trend, parent=None, layout=Qt.QVBoxLayout): print('DatesWidget(%s)' % trend) #parent = parent or trend.legend() Qt.QWidget.__init__(self, parent or trend) #trend.showLegend(True) self._trend = trend if not hasattr(trend, '_datesWidget'): trend._datesWidget = self self.setLayout(layout()) self.DEFAULT_START = 'YYYY/MM/DD hh:mm:ss' self.setTitle("Show Archiving since ...") self.xLabelStart = Qt.QLabel('Start') self.xEditStart = Qt.QLineEdit(self.DEFAULT_START) self.xEditStart.setToolTip(""" Start date, it can be: <empty> #apply -range to current date YYYY/MM/DD hh:mm:ss #absolute -1d/h/m/s #relative to current date """) self.xLabelRange = Qt.QLabel("Range") self.xRangeCB = Qt.QComboBox() self.xRangeCB.setEditable(True) self.xRangeCB.addItems(["", "1 m", "1 h", "1 d", "1 w", "30 d", "1 y"]) self.xRangeCB.setToolTip(""" Any range like: <empty> show data from Start 'til now 1m : X minutes 1h : X hours 1d : X days 1w : X weeks 1y : X years """) self.xRangeCB.setCurrentIndex(1) self.xApply = Qt.QPushButton("Refresh") self.layout().addWidget( QWidgetWithLayout(self, child=[self.xLabelStart, self.xEditStart])) self.layout().addWidget( QWidgetWithLayout(self, child=[self.xLabelRange, self.xRangeCB])) self.layout().addWidget(QWidgetWithLayout(self, child=[self.xApply])) trend.connect(self.xApply, Qt.SIGNAL("clicked()"), self.refreshAction) if hasattr(self._trend, 'getArchivedTrendLogger'): self.logger = self._trend.getArchivedTrendLogger() self.xInfo = Qt.QPushButton("Expert") self.layout().addWidget(QWidgetWithLayout(self, child=[self.xInfo])) trend.connect(self.xInfo, Qt.SIGNAL("clicked()"), self.logger.show_dialog) #if parent is trend.legend(): #trend.legend().setLayout(Qt.QVBoxLayout()) #trend.legend().layout().setAlignment(Qt.Qt.AlignBottom) #self.setMinimumWidth(150) #self.setMinimumHeight(15*4) #trend.legend().layout().addWidget(self) #trend.legend().setMinimumWidth(150) #trend.setMinimumHeight(250) #try: #trend.legend().children()[0].setMinimumWidth(150) #trend.legend().children()[0].children()[0].setMinimumWidth(150) #except: #ms = Qt.QMessageBox.warning(trend,"Error!",traceback.format_exc()) return
def show_history(self, attribute): TABS = [] print 'getting archiving readers ...' from PyTangoArchiving import Reader hdb = Reader(db='hdb', schema='hdb') tdb = Reader(db='tdb', schema='tdb') tformat = '%Y-%m-%d %H:%M:%S' str2epoch = lambda s: time.mktime(time.strptime(s, tformat)) epoch2str = lambda f: time.strftime(tformat, time.localtime(f)) attribute = attribute.lower() if attribute in hdb.get_attributes( ) or attribute in tdb.get_attributes(): print '%s is being archived' % attribute di = Qt.QDialog() wi = di #QtGui.QWidget(di) wi.setLayout(Qt.QGridLayout()) begin = Qt.QLineEdit() begin.setText(epoch2str(time.time() - 3600)) end = Qt.QLineEdit() end.setText(epoch2str(time.time())) wi.setWindowTitle('Show Archiving') wi.layout().addWidget( Qt.QLabel('Enter Begin and End dates in %s format' % tformat), 0, 0, 1, 2) wi.layout().addWidget(Qt.QLabel('Begin:'), 1, 0, 1, 1) wi.layout().addWidget(Qt.QLabel('End:'), 2, 0, 1, 1) wi.layout().addWidget(begin, 1, 1, 1, 1) wi.layout().addWidget(end, 2, 1, 1, 1) buttons = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel) wi.connect(buttons, Qt.SIGNAL('accepted()'), wi.accept) wi.connect(buttons, Qt.SIGNAL('rejected()'), wi.reject) wi.layout().addWidget(buttons, 3, 0, 1, 2) def check_values(): di.exec_() if di.result(): print 'checking result ...' start, stop = str(begin.text()), str(end.text()) if not all( re.match( '[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+', str(s).strip()) for s in (start, stop)): print 'dates are wrong ...' Qt.QMessageBox.warning( None, 'Show archiving', 'Dates seem not in %s format' % (tformat), Qt.QMessageBox.Ok) return check_values() else: print 'getting values ...' reader = tdb if str2epoch(start) > ( time.time() - 5 * 24 * 3600. ) and attribute in tdb.get_attributes() else hdb print 'using %s reader' % reader.schema values = reader.get_attribute_values( attribute, str2epoch(start), str2epoch(stop)) if not len( values ) and reader is tdb and attribute in hdb.get_attributes( ): print 'tdb failed, retrying with hdb' values = hdb.get_attribute_values( attribute, str2epoch(start), str2epoch(stop)) print 'drawing table from %d values' % len(values) tab = Qt.QTableWidget() tab.setWindowTitle('%s: %s to %s' % (attribute, start, stop)) tab.setRowCount(len(values)) tab.setColumnCount(2) tab.setHorizontalHeaderLabels(['TIME', 'VALUE']) for i, tup in enumerate(values): date, value = tup tab.setItem(i, 0, Qt.QTableWidgetItem(epoch2str(date))) tab.setItem(i, 1, Qt.QTableWidgetItem(str(value))) tab.show() tab.resizeColumnsToContents() tab.horizontalHeader().setStretchLastSection(True) TABS.append(tab) tab.connect(tab, Qt.SIGNAL('close()'), lambda o=tab: TABS.remove(o)) print 'show_history done ...' return tab else: print 'dialog closed' return None print 'asking for dates ...' return check_values() else: Qt.QMessageBox.warning( None, 'Show archiving', 'Attribute %s is not being archived' % attribute, Qt.QMessageBox.Ok)
def setupUi(self, Form): Form.setObjectName("Form") self._Form = Form self.font = QtGui.QFont() self.font.setBold(True) self.gridLayout_2 = QtGui.QGridLayout(Form) self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName("gridLayout") self.chooseLabel = Qt.QLabel() self.chooseLabel.setObjectName("chooseLabel") self.chooseLabel.setFont(self.font) self.chooseLabel.setAlignment(QtCore.Qt.AlignCenter) self.gridLayout.addWidget(self.chooseLabel, 0, 0, 1, 1) self.tac = attributeChooser() self.tac.setObjectName("taurusAttributeChooser") self.gridLayout.addWidget(self.tac, 1, 0, 6, 1) self.selectedLabel = Qt.QLabel() self.selectedLabel.setObjectName("selectedLabel") self.selectedLabel.setFont(self.font) self.selectedLabel.setAlignment(QtCore.Qt.AlignCenter) self.selectedLabel.hide() self.gridLayout.addWidget(self.selectedLabel, 0, 1, 1, 6) self.tf = TaurusForm() self.tf.setWithButtons(False) self.tf.setObjectName("taurusForm") self.tf.hide() self.gridLayout.addWidget(self.tf, 1, 1, 1, 6) self.label = Qt.QLabel() self.label.setObjectName("label") self.label.setFont(self.font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.gridLayout.addWidget(self.label, 1, 1, 1, 6) spacerItem = QtGui.QSpacerItem(1, 1, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem, 1, 1, 1, 1) self.modepLabel = QtGui.QLabel(Form) self.modepLabel.setObjectName("modepLabel") self.modepLabel.setText('Period [s]:') self.gridLayout.addWidget(self.modepLabel, 2, 1, 1, 1) self.modepLineEdit = QtGui.QLineEdit(Form) self.modepLineEdit.setObjectName("modepLineEdit") self.modepLineEdit.setValidator(Qt.QDoubleValidator(1, 14400, 1, Form)) self.modepLineEdit.setMaxLength(7) self.modepLineEdit.setMaximumWidth(60) self.modepLineEdit.setText('60.0') self.gridLayout.addWidget(self.modepLineEdit, 2, 2, 1, 1) self.modeaLabel = QtGui.QLabel(Form) self.modeaLabel.setObjectName("modeaLabel") self.modeaLabel.setText('Absolute Period [s]:') self.gridLayout.addWidget(self.modeaLabel, 3, 1, 1, 1) self.modeaLineEdit = QtGui.QLineEdit(Form) self.modeaLineEdit.setObjectName("modeaLineEdit") self.modeaLineEdit.setValidator(Qt.QDoubleValidator(1, 14400, 1, Form)) self.modeaLineEdit.setMaxLength(7) self.modeaLineEdit.setMaximumWidth(60) self.modeaLineEdit.setText('15.0') self.gridLayout.addWidget(self.modeaLineEdit, 3, 2, 1, 1) self.modeaLowerLimitLabel = QtGui.QLabel(Form) self.modeaLowerLimitLabel.setObjectName("modeaLowerLimitLabel") self.modeaLowerLimitLabel.setText('Lower Limit (decr.):') self.gridLayout.addWidget(self.modeaLowerLimitLabel, 3, 3, 1, 1) self.modeaLowerLimitLineEdit = QtGui.QLineEdit(Form) self.modeaLowerLimitLineEdit.setObjectName("modeaLowerLimitLineEdit") self.modeaLowerLimitLineEdit.setValidator( Qt.QDoubleValidator(1, 14400, 2, Form)) self.modeaLowerLimitLineEdit.setMaxLength(7) self.modeaLowerLimitLineEdit.setMaximumWidth(60) self.gridLayout.addWidget(self.modeaLowerLimitLineEdit, 3, 4, 1, 1) self.modeaUpperLimitLabel = QtGui.QLabel(Form) self.modeaUpperLimitLabel.setObjectName("modeaUpperLimitLabel") self.modeaUpperLimitLabel.setText('Upper Limit (incr.):') self.gridLayout.addWidget(self.modeaUpperLimitLabel, 3, 5, 1, 1) self.modeaUpperLimitLineEdit = QtGui.QLineEdit(Form) self.modeaUpperLimitLineEdit.setObjectName("modeaUpperLimitLineEdit") self.modeaUpperLimitLineEdit.setValidator( Qt.QDoubleValidator(1, 14400, 2, Form)) self.modeaUpperLimitLineEdit.setMaxLength(7) self.modeaUpperLimitLineEdit.setMaximumWidth(60) self.gridLayout.addWidget(self.modeaUpperLimitLineEdit, 3, 6, 1, 1) self.moderLabel = QtGui.QLabel(Form) self.moderLabel.setObjectName("moderLabel") self.moderLabel.setText('Relative Period [s]:') self.gridLayout.addWidget(self.moderLabel, 4, 1, 1, 1) self.moderLineEdit = QtGui.QLineEdit(Form) self.moderLineEdit.setObjectName("moderLineEdit") self.moderLineEdit.setValidator(Qt.QDoubleValidator(1, 14400, 1, Form)) self.moderLineEdit.setMaxLength(7) self.moderLineEdit.setMaximumWidth(60) self.moderLineEdit.setText('15.0') self.gridLayout.addWidget(self.moderLineEdit, 4, 2, 1, 1) self.moderLowerLimitPercentLabel = QtGui.QLabel(Form) self.moderLowerLimitPercentLabel.setObjectName( "moderLowerLimitPercentLabel") self.moderLowerLimitPercentLabel.setText('Lower % Limit (decr.):') self.gridLayout.addWidget(self.moderLowerLimitPercentLabel, 4, 3, 1, 1) self.moderLowerLimitPercentLineEdit = QtGui.QLineEdit(Form) self.moderLowerLimitPercentLineEdit.setObjectName( "moderLowerLimitPercentLineEdit") self.moderLowerLimitPercentLineEdit.setValidator( QtGui.QDoubleValidator(0, 1, 2, Form)) self.moderLowerLimitPercentLineEdit.setMaxLength(7) self.moderLowerLimitPercentLineEdit.setMaximumWidth(60) self.gridLayout.addWidget(self.moderLowerLimitPercentLineEdit, 4, 4, 1, 1) self.moderUpperLimitPercentLabel = QtGui.QLabel(Form) self.moderUpperLimitPercentLabel.setObjectName( "moderUpperLimitPercentLabel") self.moderUpperLimitPercentLabel.setText('Upper % Limit (incr.):') self.gridLayout.addWidget(self.moderUpperLimitPercentLabel, 4, 5, 1, 1) self.moderUpperLimitPercentLineEdit = QtGui.QLineEdit(Form) self.moderUpperLimitPercentLineEdit.setObjectName( "moderUpperLimitPercentLineEdit") self.moderUpperLimitPercentLineEdit.setValidator( Qt.QDoubleValidator(0, 1, 2, Form)) self.moderUpperLimitPercentLineEdit.setMaxLength(7) self.moderUpperLimitPercentLineEdit.setMaximumWidth(60) self.gridLayout.addWidget(self.moderUpperLimitPercentLineEdit, 4, 6, 1, 1) self.gridButtonLayout = QtGui.QGridLayout() self.gridButtonLayout.setObjectName("gridButtonLayout") spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridButtonLayout.addItem(spacerItem, 0, 1, 1, 1) self.pushButtonStart = QtGui.QPushButton(Form) self.pushButtonStart.setObjectName("pushButtonStart") self.pushButtonStart.setEnabled(False) self.gridButtonLayout.addWidget(self.pushButtonStart, 0, 2, 1, 1) self.pushButtonStop = QtGui.QPushButton(Form) self.pushButtonStop.setObjectName("pushButtonStop") self.pushButtonStop.setEnabled(False) self.gridButtonLayout.addWidget(self.pushButtonStop, 0, 3, 1, 1) self.pushButtonCancel = QtGui.QPushButton(Form) self.pushButtonCancel.setObjectName("pushButtonCancel") self.gridButtonLayout.addWidget(self.pushButtonCancel, 0, 4, 1, 1) self.gridLayout.addLayout(self.gridButtonLayout, 5, 1, 1, 6) self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 1) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form)
def show_new_dialog(klass, attribute, schema='*', parent=None, dates=[]): try: if not Qt.QApplication.instance(): Qt.QApplication([]) except: pass print 'in Vacca.widgets.show_history(%s)' print 'getting archiving readers ...' from PyTangoArchiving import Reader rd = Reader(schema.lower()) hdb = Reader('hdb') tdb = Reader('tdb') attribute = str(attribute).lower() try: dates = dates or klass.get_default_dates() if not all(map(fandango.isString, dates)): dates = map(epoch2str, dates) except: traceback.print_exc() dates = epoch2str(), epoch2str() schemas = rd.is_attribute_archived(attribute, preferent=False) if schemas: print '%s is being archived' % attribute di = Qt.QDialog(parent) wi = di #QtGui.QWidget(di) wi.setLayout(Qt.QGridLayout()) begin = Qt.QLineEdit() begin.setText(dates[0]) end = Qt.QLineEdit() end.setText(dates[1]) tfilter = Qt.QLineEdit() vfilter = Qt.QCheckBox() wi.setWindowTitle('Show %s Archiving' % attribute) wil = wi.layout() wi.layout().addWidget(Qt.QLabel(attribute), 0, 0, 1, 2) wi.layout().addWidget(Qt.QLabel('Preferred Schema'), 1, 0, 1, 1) qschema = Qt.QComboBox() qschema.insertItems(0, ['*'] + list(schemas)) wil.addWidget(qschema, 1, 1, 1, 1) #qb = Qt.QPushButton("Save as preferred schema") #wil.addWidget(qb,wil.rowCount(),0,1,2) #qi.connect(qb,Qt.SIGNAL('pushed()'),save_schema) wil.addWidget( Qt.QLabel('Enter Begin and End dates in %s format' % tformat), 2, 0, 1, 2) wil.addWidget(Qt.QLabel('Begin:'), 3, 0, 1, 1) wil.addWidget(begin, 3, 1, 1, 1) wil.addWidget(Qt.QLabel('End:'), 4, 0, 1, 1) wil.addWidget(end, 4, 1, 1, 1) wil.addWidget(Qt.QLabel('Time Filter:'), 5, 0, 1, 1) wil.addWidget(tfilter, 5, 1, 1, 1) wil.addWidget(Qt.QLabel('Value Filter:'), 6, 0, 1, 1) wil.addWidget(vfilter, 6, 1, 1, 1) buttons = Qt.QDialogButtonBox(wi) buttons.addButton(Qt.QPushButton("Export"), Qt.QDialogButtonBox.AcceptRole) bt = Qt.QPushButton("Apply") buttons.addButton(bt, Qt.QDialogButtonBox.ApplyRole) def set_schema(r=rd, a=attribute, qs=qschema): print 'setting schema ...' schema = str(qs.currentText()).strip() r.set_preferred_schema(a, schema) buttons.connect(bt, Qt.SIGNAL('clicked()'), set_schema) buttons.addButton(Qt.QPushButton("Close"), Qt.QDialogButtonBox.RejectRole) # Qt.QDialogButtonBox.Apply\ # |Qt.QDialogButtonBox.Open|Qt.QDialogButtonBox.Close) wi.connect(buttons, Qt.SIGNAL('accepted()'), wi.accept) wi.connect(buttons, Qt.SIGNAL('rejected()'), wi.reject) wi.layout().addWidget(buttons, 7, 0, 1, 2) def check_values(): di.exec_() print 'checking schema ...' schema = str(qschema.currentText()).strip() if schema != '*': rd.set_preferred_schema(attribute, schema) if di.result(): print 'checking result ...' try: start, stop = str(begin.text()), str(end.text()) try: tf = int(str(tfilter.text())) except: tf = 0 vf = vfilter.isChecked() if not all( re.match( '[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+', str(s).strip()) for s in (start, stop)): print 'dates are wrong ...' Qt.QMessageBox.warning( None, 'Show archiving', 'Dates seem not in %s format' % (tformat), Qt.QMessageBox.Ok) return check_values() else: print 'getting values ...' print 'using %s reader' % rd.schema values = rd.get_attribute_values( attribute, str2epoch(start), str2epoch(stop)) if not len( values ) and schema == '*' and hdb.is_attribute_archived( attribute, active=True): print 'tdb failed, retrying with hdb' values = hdb.get_attribute_values( attribute, str2epoch(start), str2epoch(stop)) if vf: values = fandango.arrays.decimate_array(values) if tf: print 'Filtering %d values (1/%dT)' % ( len(values), tf) values = fandango.arrays.filter_array( values, window=tf) #,begin=start,end=stop) twi = klass.setup_table(attribute, start, stop, values) klass.set_default_dates(str2epoch(start), str2epoch(stop)) button = Qt.QPushButton('Save to file') button2 = Qt.QPushButton('Send to email') def save_to_file(var=attribute, data=values, parent=twi, edit=True): try: options = { 'sep': '\\t', 'arrsep': '\\ ', 'linesep': '\\n' } import codecs dd = QOptionDialog(model=options, title='CSV Options') dd.exec_() for k, v in options.items(): options[k] = codecs.escape_decode( str(v))[0] print options filename = Qt.QFileDialog.getSaveFileName( parent, 'File to save', '/data/' + PyTangoArchiving.files. get_data_filename( var, data, 'csv', 'human'), 'CSV files (*.csv)') PyTangoArchiving.files.save_data_file( var, data, filename, format='csv', **options) if edit: try: os.system('gedit %s &' % filename) except: pass return filename except Exception, e: Qt.QMessageBox.warning( None, "Warning", "Unable to save %s\n:%s" % (filename, e)) def send_by_email(var=attribute, data=values, parent=twi): #subject,text,receivers,sender='',attachments=None,trace=False): try: receivers, ok = Qt.QInputDialog.getText( None, 'Send by email', 'to:') if ok: filename = str( save_to_file(var, data, parent, edit=False)) fandango.linos.sendmail( filename, attribute, receivers=str(receivers), attachments=[filename]) except Exception, e: Qt.QMessageBox.warning( None, "Warning", "Unable to send %s\n:%s" % (filename, e)) #button.setTextAlignment(Qt.Qt.AlignCenter) twi.connect(button, Qt.SIGNAL("pressed ()"), save_to_file) twi.layout().addWidget(button) twi.connect(button2, Qt.SIGNAL("pressed ()"), send_by_email) twi.layout().addWidget(button2) twi.show() TABS.append(twi) twi.connect(twi, Qt.SIGNAL('close()'), lambda o=twi: TABS.remove(o)) print 'show_history done ...' return twi except Exception, e: print traceback.format_exc() Qt.QMessageBox.warning( None, "Warning", "Unable to retrieve the values (%s), sorry" % e)
def trace(self, msg): self.log('trace', msg) def debug(self, msg): self.log('debug', msg) def info(self, msg): self.log('info', msg) def warning(self, msg): self.log('warning', msg) def alarm(self, msg): self.log('alarm', msg) def error(self, msg): self.log('error', msg) if __name__ == '__main__': import sys app = fqt.getApplication() m = Qt.QWidget() m.setLayout(Qt.QVBoxLayout()) w = QArchivingMode._test(*sys.argv[1:]) m.layout().addWidget(Qt.QLabel(str(sys.argv))) m.layout().addWidget(w) m.show() app.exec_()
def setupUi(self,USE_SCROLL=False,SHOW_OPTIONS=True,USE_TREND=False): self.setWindowTitle('Tango Finder : Search Attributes and Archiving') self.setLayout(Qt.QVBoxLayout()) self.setMinimumWidth(950)#550) #self.setMinimumHeight(700) self.layout().setAlignment(Qt.Qt.AlignTop) self.chooser = Qt.QFrame() self.chooser.setLayout(Qt.QHBoxLayout()) self.combo = Qt.QComboBox() #(self) #self.chooser.layout().addWidget(Qt.QLabel('Choose a domain to see temperatures status:')) #self.chooser.layout().addWidget(self.combo) #self.layout().addWidget(self.chooser) if True: self.searchbar = Qt.QFrame() self.searchbar.setLayout(Qt.QGridLayout()) self.label = Qt.QLabel('Type a part of device name and a part of attribute name, use "*" or " " as wildcards:') #self.search = Qt.QLineEdit() self.ServerFilter = Qt.QLineEdit() self.ServerFilter.setMaximumWidth(250) self.DeviceFilter = fandango.qt.Dropable(Qt.QLineEdit)() self.DeviceFilter.setSupportedMimeTypes(fandango.qt.TAURUS_DEV_MIME_TYPE) self.AttributeFilter = fandango.qt.Dropable(Qt.QLineEdit)() self.AttributeFilter.setSupportedMimeTypes([fandango.qt.TAURUS_ATTR_MIME_TYPE,fandango.qt.TEXT_MIME_TYPE]) self.update = Qt.QPushButton('Update') self.archivecheck = Qt.QCheckBox("Show archived attributes only") self.archivecheck.setChecked(False) self.layout().addWidget(self.label) [self.searchbar.layout().addWidget(o,x,y,h,w) for o,x,y,h,w in ( (Qt.QLabel("Device or Alias:"),0,0,1,1),(self.DeviceFilter,0,1,1,4), (Qt.QLabel("Attribute:"),0,5,1,1),(self.AttributeFilter,0,6,1,4), (self.update,0,10,1,1),(self.archivecheck,0,11,1,2), )] self.searchbar.layout().addWidget(Qt.QLabel('Enter Device and Attribute filters using wildcards (e.g. li/ct/plc[0-9]+ / ^stat*$ & !status ) and push Update'),1,0,4,13) if SHOW_OPTIONS: self.options = Qt.QWidget() #self.searchbar self.options.setLayout(Qt.QGridLayout()) separator = lambda x:Qt.QLabel(' '*x) row = 1 [self.options.layout().addWidget(o,x,y,h,w) for o,x,y,h,w in ( #separator(120),Qt.QLabel("Options: "),separator(5), (Qt.QLabel("Server: "),row,0,1,1),(self.ServerFilter,row,1,1,4),(Qt.QLabel(''),row,2,1,11) )] #self.panel = generate_table(load_all_thermocouples('SR14')[-1]) self.optiontab = Qt.QTabWidget() self.optiontab.addTab(self.searchbar,'Filters') self.optiontab.addTab(self.options,'Options') self.optiontab.setMaximumHeight(100) self.optiontab.setTabPosition(self.optiontab.North) self.layout().addWidget(self.optiontab) else: self.layout().addWidget(self.searchbar) self.toppan = Qt.QWidget(self) self.toppan.setLayout(Qt.QVBoxLayout()) if True: self.header = QGridTable(self.toppan) self.header.setHorizontalHeaderLabels('Label/Value Device Attribute Alias Archiving'.split()) self.header.setColumnWidth(0,350) self.toppan.layout().addWidget(self.header) if USE_SCROLL: print '*'*30 + ' USE_SCROLL=True '+'*'*30 self._scroll = MyScrollArea(self.toppan)#Qt.QScrollArea(self) self._background = AttributesPanel(self._scroll) #At least a panel should be kept (never deleted) in background to not crash the worker! self.panel = None self._scroll.setChildrenPanel(self.panel) self._scroll.setWidget(self.panel) self._scroll.setMaximumHeight(700) self.toppan.layout().addWidget(self._scroll) else: self.panel = AttributesPanel(self.toppan) self.toppan.layout().addWidget(self.panel) self.toppan.layout().addWidget(Qt.QLabel('Drag any attribute from the first column into the trend or any taurus widget you want:')) if USE_TREND: self.split = Qt.QSplitter(Qt.Qt.Vertical) self.split.setHandleWidth(10) self.split.addWidget(self.toppan) from taurus.qt.qtgui.plot import TaurusTrend from PyTangoArchiving.widget.trend import ArchivingTrend,ArchivingTrendWidget self.trend = ArchivingTrendWidget() #TaurusArchivingTrend() self.trend.setUseArchiving(True) self.trend.showLegend(True) self.split.addWidget(self.trend) self.layout().addWidget(self.split) else: self.layout().addWidget(self.toppan) type(self)._persistent_ = self