more robust implementation, prepared communication with oven, started oven controls view
This commit is contained in:
parent
58d225607f
commit
81c5a17241
|
@ -1,8 +1,9 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import sys, os, random, copy
|
import sys, os, random, copy, struct
|
||||||
|
|
||||||
|
from collections import deque
|
||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
|
|
||||||
import xml.etree.ElementTree as etree
|
import xml.etree.ElementTree as etree
|
||||||
|
@ -16,29 +17,80 @@ from matplotlib.figure import Figure
|
||||||
from matplotlib.lines import Line2D
|
from matplotlib.lines import Line2D
|
||||||
from matplotlib.path import Path
|
from matplotlib.path import Path
|
||||||
import matplotlib.patches as patches
|
import matplotlib.patches as patches
|
||||||
#from mpltools import annotation
|
|
||||||
|
#from mpltools import annotation-
|
||||||
|
|
||||||
progname = os.path.basename(sys.argv[0])
|
progname = os.path.basename(sys.argv[0])
|
||||||
progversion = "0.1"
|
progversion = "0.1"
|
||||||
|
|
||||||
def calc_colors(count):
|
def calc_colors(count):
|
||||||
|
if count == 1:
|
||||||
|
return [QtGui.QColor(0, 255, 0),]
|
||||||
r = 0
|
r = 0
|
||||||
g = 255
|
g = 255
|
||||||
step = int(512. / (count-1))
|
step = int(512. / (count-1))
|
||||||
colors = list()
|
colors = list()
|
||||||
print "step", step
|
|
||||||
for i in range(count):
|
for i in range(count):
|
||||||
colors.append(QtGui.QColor(r, g, 0))
|
colors.append(QtGui.QColor(r, g, 0))
|
||||||
if r < 255:
|
if r < 255:
|
||||||
r += step
|
r += step
|
||||||
if r > 255:
|
if r > 255:
|
||||||
g -= r - 255
|
g -= (r - 256)
|
||||||
r = 255
|
r = 255
|
||||||
|
g = max(0, g)
|
||||||
else:
|
else:
|
||||||
g -= step
|
g -= step
|
||||||
g = max(0, g)
|
g = max(0, g)
|
||||||
return colors
|
return colors
|
||||||
|
|
||||||
|
def set_colors(temp_levels):
|
||||||
|
colors = calc_colors(len(temp_levels) - 1)
|
||||||
|
ix = 0
|
||||||
|
for temp_level in temp_levels:
|
||||||
|
if not temp_level.is_env:
|
||||||
|
temp_level.color = colors[ix]
|
||||||
|
ix += 1
|
||||||
|
else:
|
||||||
|
temp_level.color = QtGui.QColor("black")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def create_profile_header(x_list, y_list):
|
||||||
|
tpl = "#ifndef _H_SOLDER_PROFILE\n" \
|
||||||
|
"#define _H_SOLDER_PROFILE\n" \
|
||||||
|
"\n" \
|
||||||
|
"%s\n" \
|
||||||
|
"\n" \
|
||||||
|
"};\n" \
|
||||||
|
"\n" \
|
||||||
|
"#endif\n"
|
||||||
|
|
||||||
|
data_tpl = "unsigned int profile_%d[%d][2] = \n%s\n" \
|
||||||
|
|
||||||
|
s = list()
|
||||||
|
|
||||||
|
ix = 0
|
||||||
|
for x, y in zip(x_list, y_list):
|
||||||
|
tmp = list()
|
||||||
|
for a, b in zip(x, y):
|
||||||
|
tmp.append("{%d, %d}" % (a, b))
|
||||||
|
s.append(data_tpl % (ix, len(x), "\n".join(tmp)))
|
||||||
|
ix += 1
|
||||||
|
|
||||||
|
open("test.h", "w").write(tpl % ("\n".join(s)))
|
||||||
|
|
||||||
|
def create_profile_packet(x, y):
|
||||||
|
# msg = [length, x_0, y_0,x_1, y_1, ..., x_length-1, y_length-1]
|
||||||
|
|
||||||
|
tmp = [len(x) * 2 * 2,]
|
||||||
|
|
||||||
|
for a, b in zip(x, y):
|
||||||
|
tmp.append(a)
|
||||||
|
tmp.append(b)
|
||||||
|
|
||||||
|
tpl = "H" + (len(x) * 2) * "H"
|
||||||
|
res = struct.pack(tpl, *tmp)
|
||||||
|
return res
|
||||||
|
|
||||||
def getTemperature():
|
def getTemperature():
|
||||||
return 20.
|
return 20.
|
||||||
|
@ -60,6 +112,7 @@ class Solder(object):
|
||||||
self.temp_levels = list()
|
self.temp_levels = list()
|
||||||
self.durations = list()
|
self.durations = list()
|
||||||
self.rates = list()
|
self.rates = list()
|
||||||
|
self.changed = False
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return unicode(self.name)
|
return unicode(self.name)
|
||||||
|
@ -100,12 +153,12 @@ class Solder(object):
|
||||||
for ix, temp_level in enumerate(self.temp_levels):
|
for ix, temp_level in enumerate(self.temp_levels):
|
||||||
if temp_level != self.temp_levels[0] and temp_level not in used_temp_levels:
|
if temp_level != self.temp_levels[0] and temp_level not in used_temp_levels:
|
||||||
ix = self.temp_levels.index(temp_level)
|
ix = self.temp_levels.index(temp_level)
|
||||||
raise ValueError("TempLevel %r not connected to %r" % (temp_level.name[ix-1], self.temp_levels[ix].name))
|
raise ValueError("TempLevel %r not connected to %r" % (self.temp_levels[ix-1].name, self.temp_levels[ix].name))
|
||||||
|
|
||||||
temp_levels = None
|
temp_levels = None
|
||||||
duration = None
|
duration = None
|
||||||
for sts, dur in self.durations:
|
for sts, dur in self.durations:
|
||||||
if sts[0] == temp_level:
|
if sts and sts[0] == temp_level:
|
||||||
duration = dur
|
duration = dur
|
||||||
temp_levels = sts
|
temp_levels = sts
|
||||||
break
|
break
|
||||||
|
@ -137,7 +190,7 @@ class Solder(object):
|
||||||
duration_points[ix] = (x[-2:], y[-2:])
|
duration_points[ix] = (x[-2:], y[-2:])
|
||||||
else:
|
else:
|
||||||
for ex, (sts, rate) in enumerate(self.rates):
|
for ex, (sts, rate) in enumerate(self.rates):
|
||||||
if sts[0] == temp_level:
|
if sts and sts[0] == temp_level:
|
||||||
used_temp_levels.add(sts[1])
|
used_temp_levels.add(sts[1])
|
||||||
duration = (sts[1].temp - temp_level.temp) / rate
|
duration = (sts[1].temp - temp_level.temp) / rate
|
||||||
self.time += duration
|
self.time += duration
|
||||||
|
@ -167,14 +220,7 @@ class Solder(object):
|
||||||
env_count += 1
|
env_count += 1
|
||||||
s.add_temp_level(temp_level.attrib["name"], temp, is_env)
|
s.add_temp_level(temp_level.attrib["name"], temp, is_env)
|
||||||
|
|
||||||
colors = calc_colors(len(s.temp_levels) - 1)
|
set_colors(s.temp_levels)
|
||||||
ix = 0
|
|
||||||
for temp_level in s.temp_levels:
|
|
||||||
if not temp_level.is_env:
|
|
||||||
temp_level.color = colors[ix]
|
|
||||||
ix += 1
|
|
||||||
else:
|
|
||||||
temp_level.color = QtGui.QColor("black")
|
|
||||||
|
|
||||||
for duration in solder_node.findall("duration"):
|
for duration in solder_node.findall("duration"):
|
||||||
temp_levels = list()
|
temp_levels = list()
|
||||||
|
@ -225,7 +271,9 @@ class SolderListModel(QtCore.QAbstractListModel):
|
||||||
|
|
||||||
def create_solder(self):
|
def create_solder(self):
|
||||||
solder = Solder("new", "")
|
solder = Solder("new", "")
|
||||||
solder.add_temp_level("environment temp", getTemperature(), True)
|
|
||||||
|
tl = solder.add_temp_level("environment temp", getTemperature(), True)
|
||||||
|
tl.color = QtGui.QColor(0, 0, 0)
|
||||||
self.listdata.append(solder)
|
self.listdata.append(solder)
|
||||||
self.reset()
|
self.reset()
|
||||||
|
|
||||||
|
@ -291,9 +339,8 @@ class TempLevelModel(QtCore.QAbstractTableModel):
|
||||||
return tmp
|
return tmp
|
||||||
|
|
||||||
def add_temp_level(self, index, temp_level):
|
def add_temp_level(self, index, temp_level):
|
||||||
self.beginInsertRows(QtGui.QModelIndex(), index.row(), 1)
|
self.temp_levels.insert(index.row() + 1, temp_level)
|
||||||
self.temp_levels.temp_levels.insert(index.row(), temp_level)
|
set_colors(self.temp_levels)
|
||||||
self.endInsertRows()
|
|
||||||
self.reset()
|
self.reset()
|
||||||
self._changed = True
|
self._changed = True
|
||||||
|
|
||||||
|
@ -346,23 +393,23 @@ class Plotter(FigureCanvas):
|
||||||
updated = False
|
updated = False
|
||||||
self.x, self.y, self.xmax, self.ymax, self.duration_points, self.rate_points = self.solder.calc_profile()
|
self.x, self.y, self.xmax, self.ymax, self.duration_points, self.rate_points = self.solder.calc_profile()
|
||||||
|
|
||||||
#for states, value in self.durations.iteritems():
|
#for states, value in self.durations.iteritems():
|
||||||
#annotation.slope_marker((states[0])
|
#annotation.slope_marker((states[0])
|
||||||
|
|
||||||
self.axes.set_xbound(lower=0, upper=self.xmax + 20)
|
self.axes.set_xbound(lower=0, upper=self.xmax + 20)
|
||||||
self.axes.set_ybound(lower=0, upper=self.ymax + 20)
|
self.axes.set_ybound(lower=0, upper=self.ymax + 20)
|
||||||
|
|
||||||
self.axes.set_yticks([state.temp for state in self.solder.temp_levels])
|
self.axes.set_yticks([state.temp for state in self.solder.temp_levels])
|
||||||
self.axes.set_xticks(self.x)
|
self.axes.set_xticks(self.x)
|
||||||
|
|
||||||
self.plot_data.set_xdata(self.x)
|
self.plot_data.set_xdata(self.x)
|
||||||
self.plot_data.set_ydata(self.y)
|
self.plot_data.set_ydata(self.y)
|
||||||
self.plot_data.set_zorder(20)
|
self.plot_data.set_zorder(20)
|
||||||
|
|
||||||
duration_widget = self.myapp.duration_widget
|
duration_widget = self.myapp.duration_widget
|
||||||
|
|
||||||
#self.selection_data.set_xdata(array(da))
|
#self.selection_data.set_xdata(array(da))
|
||||||
#self.selection_data.set_ydata(array(db))
|
#self.selection_data.set_ydata(array(db))
|
||||||
|
|
||||||
self.fig.lines = lines = list()
|
self.fig.lines = lines = list()
|
||||||
for temp_level in self.solder.temp_levels:
|
for temp_level in self.solder.temp_levels:
|
||||||
|
@ -374,6 +421,10 @@ class Plotter(FigureCanvas):
|
||||||
self.axes.legend(("Estimated profile",))
|
self.axes.legend(("Estimated profile",))
|
||||||
self.draw()
|
self.draw()
|
||||||
|
|
||||||
|
def setData(self, solder):
|
||||||
|
self.solder = solder
|
||||||
|
self.updated = True
|
||||||
|
|
||||||
|
|
||||||
class AddRemoveWidget(QtGui.QWidget):
|
class AddRemoveWidget(QtGui.QWidget):
|
||||||
def __init__(self, parent, with_upown=True):
|
def __init__(self, parent, with_upown=True):
|
||||||
|
@ -395,6 +446,8 @@ class AddRemoveWidget(QtGui.QWidget):
|
||||||
self.down_button = QtGui.QPushButton("Down")
|
self.down_button = QtGui.QPushButton("Down")
|
||||||
self._layout.addWidget(self.up_button)
|
self._layout.addWidget(self.up_button)
|
||||||
self._layout.addWidget(self.down_button)
|
self._layout.addWidget(self.down_button)
|
||||||
|
self.up_button.setStyleSheet(sh)
|
||||||
|
self.down_button.setStyleSheet(sh)
|
||||||
self._layout.addStretch(4)
|
self._layout.addStretch(4)
|
||||||
|
|
||||||
|
|
||||||
|
@ -437,10 +490,10 @@ class ConstraintListModel(QtCore.QAbstractListModel):
|
||||||
|
|
||||||
|
|
||||||
class ConstraintWidget(QtGui.QWidget):
|
class ConstraintWidget(QtGui.QWidget):
|
||||||
def __init__(self, name, solder):
|
def __init__(self, name):
|
||||||
super(ConstraintWidget, self).__init__()
|
super(ConstraintWidget, self).__init__()
|
||||||
self.name = name
|
self.name = name
|
||||||
#self.solder = solder
|
|
||||||
self.spinbox_block = False
|
self.spinbox_block = False
|
||||||
|
|
||||||
self.constraint_model = ConstraintListModel(self) # constraint selection
|
self.constraint_model = ConstraintListModel(self) # constraint selection
|
||||||
|
@ -501,7 +554,7 @@ class ConstraintWidget(QtGui.QWidget):
|
||||||
self.connect(
|
self.connect(
|
||||||
self.constraint_controls.add_button,
|
self.constraint_controls.add_button,
|
||||||
QtCore.SIGNAL("clicked()"),
|
QtCore.SIGNAL("clicked()"),
|
||||||
self.constraint_model.append_constraint)
|
self.add_constraint)
|
||||||
|
|
||||||
self.connect(
|
self.connect(
|
||||||
self.constraint_controls.remove_button,
|
self.constraint_controls.remove_button,
|
||||||
|
@ -514,18 +567,36 @@ class ConstraintWidget(QtGui.QWidget):
|
||||||
self.constraint_value_changed)
|
self.constraint_value_changed)
|
||||||
|
|
||||||
def setData(self, solder):
|
def setData(self, solder):
|
||||||
print self.setData, 1
|
|
||||||
self.solder = solder
|
self.solder = solder
|
||||||
print self.setData, 2
|
self.all_temp_levels.setTempLevels(solder.temp_levels)
|
||||||
self.all_temp_levels.setTempLevels(self.solder.temp_levels)
|
self._set_data(solder)
|
||||||
print self.setData, 3
|
self.set_controls()
|
||||||
self._set_data()
|
|
||||||
print self.setData, 4
|
def set_controls(self):
|
||||||
|
if not self.constraint_model.constraint_list:
|
||||||
|
self.controls.value.setEnabled(False)
|
||||||
|
self.constraint_controls.remove_button.setEnabled(False)
|
||||||
|
self.controls.add_button.setEnabled(False)
|
||||||
|
self.controls.remove_button.setEnabled(False)
|
||||||
|
self.controls.up_button.setEnabled(False)
|
||||||
|
self.controls.down_button.setEnabled(False)
|
||||||
|
else:
|
||||||
|
self.controls.value.setEnabled(True)
|
||||||
|
self.constraint_controls.remove_button.setEnabled(True)
|
||||||
|
self.controls.add_button.setEnabled(True)
|
||||||
|
self.controls.remove_button.setEnabled(True)
|
||||||
|
self.controls.up_button.setEnabled(True)
|
||||||
|
self.controls.down_button.setEnabled(True)
|
||||||
|
|
||||||
|
|
||||||
|
def add_constraint(self):
|
||||||
|
self.constraint_model.append_constraint()
|
||||||
|
self.set_controls()
|
||||||
|
|
||||||
def _constraint_selected(self, index):
|
def _constraint_selected(self, index):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def _set_data(self):
|
def _set_data(self, solder):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def add_temp_level_to_constraint(self):
|
def add_temp_level_to_constraint(self):
|
||||||
|
@ -548,21 +619,25 @@ class ConstraintWidget(QtGui.QWidget):
|
||||||
del self.constraint_model.constraint_list[src_row]
|
del self.constraint_model.constraint_list[src_row]
|
||||||
self.constraint_model.reset()
|
self.constraint_model.reset()
|
||||||
self.selected_temp_levels.clear()
|
self.selected_temp_levels.clear()
|
||||||
|
self.set_controls()
|
||||||
|
|
||||||
def constraint_value_changed(self, value):
|
def constraint_value_changed(self, value):
|
||||||
print self.constraint_value_changed
|
|
||||||
if self.spinbox_block:
|
if self.spinbox_block:
|
||||||
self.spinbox_block = False
|
self.spinbox_block = False
|
||||||
return
|
return
|
||||||
print
|
|
||||||
print
|
|
||||||
print "IIIIEK"
|
|
||||||
print
|
|
||||||
src_index = self.constraint_view.currentIndex().row()
|
src_index = self.constraint_view.currentIndex().row()
|
||||||
self.constraint_model.constraint_list[src_index][1] = value
|
self.constraint_model.constraint_list[src_index][1] = value
|
||||||
|
|
||||||
def slot_temp_level_removed(self, temp_level):
|
def slot_temp_level_removed(self, temp_level):
|
||||||
print "temp_level"
|
|
||||||
|
deletes = deque()
|
||||||
|
ix = 0
|
||||||
|
for temp_levels, v in self.constraint_model.constraint_list:
|
||||||
|
if temp_level in temp_levels:
|
||||||
|
deletes.appendleft(ix)
|
||||||
|
ix += 1
|
||||||
|
for i in deletes:
|
||||||
|
del self.constraint_model.constraint_list[i]
|
||||||
self.reset()
|
self.reset()
|
||||||
|
|
||||||
def temp_level_up(self):
|
def temp_level_up(self):
|
||||||
|
@ -578,50 +653,116 @@ class ConstraintWidget(QtGui.QWidget):
|
||||||
|
|
||||||
class DurationConstraintWidget(ConstraintWidget):
|
class DurationConstraintWidget(ConstraintWidget):
|
||||||
|
|
||||||
def _set_data(self):
|
def _set_data(self, solder):
|
||||||
self.spinbox_block = True
|
self.spinbox_block = True
|
||||||
print self._set_data, 1
|
self.constraint_model.constraint_list = solder.durations
|
||||||
self.constraint_model.constraint_list.extend(self.solder.durations)
|
|
||||||
print self._set_data, 2
|
|
||||||
ix = self.constraint_model.index(0, 0)
|
ix = self.constraint_model.index(0, 0)
|
||||||
print self._set_data, 3
|
|
||||||
self.constraint_view.setCurrentIndex(ix)
|
|
||||||
print self._set_data, 4
|
|
||||||
self._constraint_selected(ix)
|
self._constraint_selected(ix)
|
||||||
print self._set_data, 5
|
self.constraint_view.setCurrentIndex(ix)
|
||||||
|
|
||||||
def _constraint_selected(self, index):
|
def _constraint_selected(self, index):
|
||||||
print self._constraint_selected
|
if index.isValid():
|
||||||
self.spinbox_block = True
|
self.spinbox_block = True
|
||||||
temp_levels, value = self.constraint_model.constraint_list[index.row()]
|
temp_levels, value = self.constraint_model.constraint_list[index.row()]
|
||||||
self.selected_temp_levels.setTempLevels(temp_levels)
|
self.selected_temp_levels.setTempLevels(temp_levels)
|
||||||
self.controls.value.setValue(value)
|
self.controls.value.setValue(value)
|
||||||
|
else:
|
||||||
|
self.spinbox_block = True
|
||||||
|
self.selected_temp_levels.setTempLevels([])
|
||||||
|
self.controls.value.setValue(0)
|
||||||
|
|
||||||
|
|
||||||
|
class OvenControlsWidget(QtGui.QWidget):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super(OvenControlsWidget, self).__init__(parent)
|
||||||
|
|
||||||
|
self.left = QtGui.QWidget(self)
|
||||||
|
|
||||||
|
self.temp_lcd = QtGui.QLCDNumber(self)
|
||||||
|
self.time_lcd = QtGui.QLCDNumber(self)
|
||||||
|
|
||||||
|
self.time_lcd.setDigitCount(3)
|
||||||
|
self.temp_lcd.setDigitCount(3)
|
||||||
|
|
||||||
|
palette = QtGui.QPalette()
|
||||||
|
palette.setColor(QtGui.QPalette.WindowText, QtCore.Qt.black)
|
||||||
|
self.temp_lcd.setPalette(palette)
|
||||||
|
self.time_lcd.setPalette(palette)
|
||||||
|
self.time_lcd.setSmallDecimalPoint(False)
|
||||||
|
self.temp_lcd.setSmallDecimalPoint(False)
|
||||||
|
|
||||||
|
self.temp_lcd.setSegmentStyle(2)
|
||||||
|
self.time_lcd.setSegmentStyle(2)
|
||||||
|
self.time_lcd.display("000")
|
||||||
|
self.temp_lcd.display("142")
|
||||||
|
|
||||||
|
self.temp_label = QtGui.QLabel("Time", self)
|
||||||
|
self.time_label = QtGui.QLabel("Temp", self)
|
||||||
|
self.temp_label.setBuddy(self.temp_lcd)
|
||||||
|
self.time_label.setBuddy(self.time_lcd)
|
||||||
|
|
||||||
|
self.sicon = QtGui.QIcon.fromTheme("media-playback-start")
|
||||||
|
self.picon = QtGui.QIcon.fromTheme("media-playback-pause")
|
||||||
|
self.start_button = QtGui.QPushButton(self.sicon, "start")
|
||||||
|
self.start_button.setCheckable(True)
|
||||||
|
|
||||||
|
layout = QtGui.QHBoxLayout(self.left)
|
||||||
|
layout.addWidget(self.time_label)
|
||||||
|
layout.addWidget(self.time_lcd)
|
||||||
|
layout.addWidget(self.temp_label)
|
||||||
|
layout.addWidget(self.temp_lcd)
|
||||||
|
layout.addWidget(self.start_button)
|
||||||
|
|
||||||
|
layout2 = QtGui.QHBoxLayout()
|
||||||
|
self.temp_level_widget = TempLevelWidget(self, True)
|
||||||
|
layout2.addWidget(self.temp_level_widget, 2)
|
||||||
|
layout2.addWidget(self.left, 4)
|
||||||
|
self.setLayout(layout2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
self.connect(
|
||||||
|
self.start_button,
|
||||||
|
QtCore.SIGNAL("clicked()"),
|
||||||
|
self.toggle_button)
|
||||||
|
|
||||||
|
def toggle_button(self):
|
||||||
|
if self.start_button.isChecked():
|
||||||
|
self.start_button.setIcon(self.picon)
|
||||||
|
else:
|
||||||
|
self.start_button.setIcon(self.sicon)
|
||||||
|
|
||||||
|
|
||||||
class RateConstraintWidget(ConstraintWidget):
|
class RateConstraintWidget(ConstraintWidget):
|
||||||
|
|
||||||
def _set_data(self):
|
def _set_data(self, solder):
|
||||||
print self._set_data
|
|
||||||
self.spinbox_block = True
|
self.spinbox_block = True
|
||||||
self.constraint_model.constraint_list.extend(self.solder.rates)
|
self.constraint_model.constraint_list = solder.rates
|
||||||
|
|
||||||
ix = self.constraint_model.index(0, 0)
|
ix = self.constraint_model.index(0, 0)
|
||||||
self.constraint_view.setCurrentIndex(ix)
|
|
||||||
self._constraint_selected(ix)
|
self._constraint_selected(ix)
|
||||||
|
self.constraint_view.setCurrentIndex(ix)
|
||||||
|
|
||||||
|
|
||||||
def _constraint_selected(self, index):
|
def _constraint_selected(self, index):
|
||||||
print self._constraint_selected
|
if index.isValid():
|
||||||
self.spinbox_block = True
|
self.spinbox_block = True
|
||||||
temp_levels, value = self.constraint_model.constraint_list[index.row()]
|
temp_levels, value = self.constraint_model.constraint_list[index.row()]
|
||||||
self.selected_temp_levels.setTempLevels(temp_levels)
|
self.selected_temp_levels.setTempLevels(temp_levels)
|
||||||
self.controls.value.setValue(value)
|
self.controls.value.setValue(value)
|
||||||
|
else:
|
||||||
|
self.spinbox_block = True
|
||||||
|
self.selected_temp_levels.setTempLevels([])
|
||||||
|
self.controls.value.setValue(0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TempLevelWidget(QtGui.QWidget):
|
class TempLevelWidget(QtGui.QWidget):
|
||||||
temp_level_removed = QtCore.pyqtSignal(TempLevel)
|
temp_level_removed = QtCore.pyqtSignal(TempLevel)
|
||||||
|
|
||||||
def __init__(self, parent, solder):
|
def __init__(self, parent, readonly=False):
|
||||||
super(TempLevelWidget, self).__init__(parent)
|
super(TempLevelWidget, self).__init__(parent)
|
||||||
self.temp_level_model = TempLevelModel(self)
|
self.temp_level_model = TempLevelModel(self)
|
||||||
|
|
||||||
|
@ -632,11 +773,8 @@ class TempLevelWidget(QtGui.QWidget):
|
||||||
self.temp_level_view.horizontalHeader().setStretchLastSection(True)
|
self.temp_level_view.horizontalHeader().setStretchLastSection(True)
|
||||||
self.temp_level_view.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
|
self.temp_level_view.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
|
||||||
|
|
||||||
self.controls = AddRemoveWidget(self)
|
|
||||||
|
|
||||||
h = QtGui.QHBoxLayout()
|
h = QtGui.QHBoxLayout()
|
||||||
h.addWidget(self.temp_level_view)
|
h.addWidget(self.temp_level_view)
|
||||||
h.addWidget(self.controls)
|
|
||||||
self.setLayout(h)
|
self.setLayout(h)
|
||||||
|
|
||||||
self.connect(
|
self.connect(
|
||||||
|
@ -644,31 +782,69 @@ class TempLevelWidget(QtGui.QWidget):
|
||||||
QtCore.SIGNAL("clicked(QModelIndex)"),
|
QtCore.SIGNAL("clicked(QModelIndex)"),
|
||||||
self.temp_level_selected)
|
self.temp_level_selected)
|
||||||
|
|
||||||
self.connect(
|
if not readonly:
|
||||||
self.controls.remove_button,
|
self.controls = AddRemoveWidget(self)
|
||||||
QtCore.SIGNAL("clicked()"),
|
h.addWidget(self.controls)
|
||||||
self.remove_temp_level)
|
|
||||||
|
self.connect(
|
||||||
|
self.controls.add_button,
|
||||||
|
QtCore.SIGNAL("clicked()"),
|
||||||
|
self.add_temp_level)
|
||||||
|
|
||||||
|
self.connect(
|
||||||
|
self.controls.remove_button,
|
||||||
|
QtCore.SIGNAL("clicked()"),
|
||||||
|
self.remove_temp_level)
|
||||||
|
|
||||||
|
self.connect(
|
||||||
|
self.controls.up_button,
|
||||||
|
QtCore.SIGNAL("clicked()"),
|
||||||
|
self.temp_level_up)
|
||||||
|
|
||||||
|
self.connect(
|
||||||
|
self.controls.down_button,
|
||||||
|
QtCore.SIGNAL("clicked()"),
|
||||||
|
self.temp_level_down)
|
||||||
|
|
||||||
|
|
||||||
|
def setData(self, solder):
|
||||||
|
self.temp_level_model.setTempLevels(solder.temp_levels)
|
||||||
|
self.temp_level_view.resizeColumnsToContents()
|
||||||
|
|
||||||
|
|
||||||
def add_temp_level(self):
|
def add_temp_level(self):
|
||||||
index = self.temp_level_view.currentIndex()
|
index = self.temp_level_view.currentIndex()
|
||||||
self.temp_level_model.add_temp_level(index,TempLevel("new", 0))
|
self.temp_level_model.add_temp_level(index, TempLevel("new " + str(self.temp_level_model.rowCount(None)), 0))
|
||||||
|
self.temp_level_view.setCurrentIndex(self.temp_level_model.index(index.row() + 1, 0))
|
||||||
|
self.plotter.solder.changed = True
|
||||||
|
|
||||||
|
|
||||||
def remove_temp_level(self):
|
def remove_temp_level(self):
|
||||||
self.temp_level_removed.emit(
|
self.temp_level_removed.emit(
|
||||||
self.temp_level_model.remove_temp_level(
|
self.temp_level_model.remove_temp_level(
|
||||||
self.temp_level_view.currentIndex().row()))
|
self.temp_level_view.currentIndex().row()))
|
||||||
|
self.plotter.solder.changed = True
|
||||||
|
|
||||||
|
def temp_level_up(self):
|
||||||
|
dst_row = self.temp_level_view.currentIndex().row()
|
||||||
|
self.temp_level_model.temp_levels[dst_row - 1], self.temp_level_model.temp_levels[dst_row] = self.temp_level_model.temp_levels[dst_row], self.temp_level_model.temp_levels[dst_row - 1]
|
||||||
|
self.temp_level_model.reset()
|
||||||
|
self.plotter.solder.changed = True
|
||||||
|
|
||||||
|
def temp_level_down(self):
|
||||||
|
dst_row = self.selected_temp_levels_view.currentIndex().row()
|
||||||
|
self.temp_level_model.temp_levels[dst_row], self.temp_level_model.temp_levels[dst_row + 1] = self.temp_level_model.temp_levels[dst_row + 1], self.temp_level_model.temp_levels[dst_row]
|
||||||
|
self.temp_level_model.reset()
|
||||||
|
self.plotter.solder.changed = True
|
||||||
|
|
||||||
|
|
||||||
def temp_level_selected(self, index):
|
def temp_level_selected(self, index):
|
||||||
if index.isValid():
|
if index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
is_env = self.temp_level_model.temp_levels[row].is_env
|
is_env = self.temp_level_model.temp_levels[row].is_env
|
||||||
is_end = row == len(self.temp_level_model.temp_levels) - 1
|
#is_end = row == len(self.temp_level_model.temp_levels) - 1
|
||||||
self.controls.add_button.setEnabled(not is_end)
|
#self.controls.add_button.setEnabled(not is_end)
|
||||||
self.controls.remove_button.setEnabled(not is_env)
|
self.controls.remove_button.setEnabled(not is_env)
|
||||||
print "remove_button state", self.controls.remove_button.isEnabled()
|
|
||||||
|
|
||||||
class ApplicationWindow(QtGui.QMainWindow):
|
class ApplicationWindow(QtGui.QMainWindow):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -679,12 +855,41 @@ class ApplicationWindow(QtGui.QMainWindow):
|
||||||
self.setWindowTitle("application main window")
|
self.setWindowTitle("application main window")
|
||||||
|
|
||||||
self.file_menu = QtGui.QMenu('&File', self)
|
self.file_menu = QtGui.QMenu('&File', self)
|
||||||
self.file_menu.addAction('&Quit', self.fileQuit,
|
self.file_menu.addAction('&Create profile header', self.create_header,
|
||||||
QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
|
QtCore.Qt.CTRL + QtCore.Qt.Key_C)
|
||||||
self.file_menu.addAction('&Save plot', self.save_plot,
|
self.file_menu.addAction('&Save plot', self.save_plot,
|
||||||
QtCore.Qt.CTRL + QtCore.Qt.Key_S)
|
QtCore.Qt.CTRL + QtCore.Qt.Key_S)
|
||||||
|
self.file_menu.addAction('&Quit', self.fileQuit,
|
||||||
|
QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
|
||||||
|
|
||||||
self.menuBar().addMenu(self.file_menu)
|
self.menuBar().addMenu(self.file_menu)
|
||||||
|
|
||||||
|
self.view_menu = QtGui.QMenu('&View', self)
|
||||||
|
self.profile_view_action = self.view_menu.addAction("&Profile View")
|
||||||
|
self.controls_view_action = self.view_menu.addAction("&Oven Controls View")
|
||||||
|
|
||||||
|
|
||||||
|
self.view_group = QtGui.QActionGroup(self)
|
||||||
|
self.view_group.setExclusive(True)
|
||||||
|
|
||||||
|
self.view_group.addAction(self.controls_view_action)
|
||||||
|
self.view_group.addAction(self.profile_view_action)
|
||||||
|
|
||||||
|
self.profile_view_action.setCheckable(True)
|
||||||
|
self.controls_view_action.setCheckable(True)
|
||||||
|
|
||||||
|
self.connect(self.profile_view_action,
|
||||||
|
QtCore.SIGNAL("triggered()"),
|
||||||
|
self.open_profile_view)
|
||||||
|
|
||||||
|
self.connect(self.controls_view_action,
|
||||||
|
QtCore.SIGNAL("triggered()"),
|
||||||
|
self.open_controls_view)
|
||||||
|
|
||||||
|
self.profile_view_action.setChecked(True)
|
||||||
|
|
||||||
|
self.menuBar().addMenu(self.view_menu)
|
||||||
|
|
||||||
self.help_menu = QtGui.QMenu('&Help', self)
|
self.help_menu = QtGui.QMenu('&Help', self)
|
||||||
self.menuBar().addSeparator()
|
self.menuBar().addSeparator()
|
||||||
self.menuBar().addMenu(self.help_menu)
|
self.menuBar().addMenu(self.help_menu)
|
||||||
|
@ -698,13 +903,17 @@ class ApplicationWindow(QtGui.QMainWindow):
|
||||||
self.solder_controls = AddRemoveWidget(self, False)
|
self.solder_controls = AddRemoveWidget(self, False)
|
||||||
|
|
||||||
self.tab_widget = QtGui.QTabWidget(self)
|
self.tab_widget = QtGui.QTabWidget(self)
|
||||||
self.temp_level_widget = TempLevelWidget(self, self.solder_model.listdata[0])
|
self.temp_level_widget = TempLevelWidget(self)
|
||||||
self.duration_widget = DurationConstraintWidget(u"Duration (s)", self.solder_model.listdata[0])
|
self.duration_widget = DurationConstraintWidget(u"Duration (s)")
|
||||||
self.rate_widget = RateConstraintWidget(u"Rate (°C/s)", self.solder_model.listdata[0])
|
self.rate_widget = RateConstraintWidget(u"Rate (°C/s)")
|
||||||
self.tab_widget.addTab(self.temp_level_widget, u"Temperature Levels")
|
self.tab_widget.addTab(self.temp_level_widget, u"Temperature Levels")
|
||||||
self.tab_widget.addTab(self.duration_widget, u"Duration (s)")
|
self.tab_widget.addTab(self.duration_widget, u"Duration (s)")
|
||||||
self.tab_widget.addTab(self.rate_widget, u"Rate (°C/s)")
|
self.tab_widget.addTab(self.rate_widget, u"Rate (°C/s)")
|
||||||
|
|
||||||
|
self.plotter = Plotter(self, self, width=5, height=4, dpi=self.dpi)
|
||||||
|
self.controls_widget = OvenControlsWidget(self)
|
||||||
|
self.controls_widget.setVisible(False)
|
||||||
|
|
||||||
self.connect(
|
self.connect(
|
||||||
self.solder_view,
|
self.solder_view,
|
||||||
QtCore.SIGNAL("clicked(QModelIndex)"),
|
QtCore.SIGNAL("clicked(QModelIndex)"),
|
||||||
|
@ -721,16 +930,20 @@ class ApplicationWindow(QtGui.QMainWindow):
|
||||||
pl.addWidget(self.solder_controls, 1)
|
pl.addWidget(self.solder_controls, 1)
|
||||||
pl.addWidget(self.tab_widget, 6)
|
pl.addWidget(self.tab_widget, 6)
|
||||||
|
|
||||||
|
|
||||||
self.splitter = QtGui.QSplitter(QtCore.Qt.Vertical, self)
|
self.splitter = QtGui.QSplitter(QtCore.Qt.Vertical, self)
|
||||||
self.plotter = Plotter(self, self, width=5, height=4, dpi=self.dpi)
|
|
||||||
|
|
||||||
self.solder_view.setCurrentIndex(self.solder_model.index(0,0))
|
self.solder_view.setCurrentIndex(self.solder_model.index(0,0))
|
||||||
self.solder_selected(self.solder_model.index(0,0))
|
self.solder_selected(self.solder_model.index(0,0))
|
||||||
|
|
||||||
self.splitter.addWidget(self.settings_widget)
|
self.splitter.addWidget(self.settings_widget)
|
||||||
|
self.splitter.addWidget(self.controls_widget)
|
||||||
self.splitter.addWidget(self.plotter)
|
self.splitter.addWidget(self.plotter)
|
||||||
self.splitter.setStretchFactor(0, 2)
|
self.splitter.setStretchFactor(0, 2)
|
||||||
self.splitter.setStretchFactor(1, 8)
|
self.splitter.setStretchFactor(1, 2)
|
||||||
|
self.splitter.setStretchFactor(2, 8)
|
||||||
|
|
||||||
|
self.solder_controls.hide()
|
||||||
|
|
||||||
self.setCentralWidget(self.splitter)
|
self.setCentralWidget(self.splitter)
|
||||||
|
|
||||||
|
@ -739,20 +952,43 @@ class ApplicationWindow(QtGui.QMainWindow):
|
||||||
self.temp_level_widget.temp_level_removed.connect(self.duration_widget.slot_temp_level_removed)
|
self.temp_level_widget.temp_level_removed.connect(self.duration_widget.slot_temp_level_removed)
|
||||||
self.temp_level_widget.temp_level_removed.connect(self.rate_widget.slot_temp_level_removed)
|
self.temp_level_widget.temp_level_removed.connect(self.rate_widget.slot_temp_level_removed)
|
||||||
|
|
||||||
|
def getPlotter(self):
|
||||||
|
return self.plotter
|
||||||
|
|
||||||
|
def create_header(self):
|
||||||
|
x_list = list()
|
||||||
|
y_list = list()
|
||||||
|
for solder in self.solder_model.listdata:
|
||||||
|
x, y, xmax, ymax, duration_points, rate_points = solder.calc_profile()
|
||||||
|
x_list.append(x)
|
||||||
|
y_list.append(y)
|
||||||
|
print "packet", repr(create_profile_packet(x, y))
|
||||||
|
|
||||||
|
create_profile_header(x_list, y_list)
|
||||||
|
|
||||||
def solder_selected(self, index):
|
def solder_selected(self, index):
|
||||||
if index.isValid():
|
if index.isValid():
|
||||||
solder = self.plotter.solder = self.solder_model.listdata[index.row()]
|
solder = self.solder_model.listdata[index.row()]
|
||||||
self.temp_level_widget.temp_level_model.setTempLevels(solder.temp_levels)
|
self.temp_level_widget.setData(solder)
|
||||||
self.temp_level_widget.temp_level_view.resizeColumnsToContents()
|
|
||||||
self.duration_widget.setData(solder)
|
self.duration_widget.setData(solder)
|
||||||
self.rate_widget.setData(solder)
|
self.rate_widget.setData(solder)
|
||||||
self.plotter.updated = True
|
self.plotter.setData(solder)
|
||||||
|
self.controls_widget.temp_level_widget.setData(solder)
|
||||||
|
|
||||||
|
def open_controls_view(self):
|
||||||
|
print self.open_controls_view
|
||||||
|
self.controls_widget.show()
|
||||||
|
self.settings_widget.hide()
|
||||||
|
|
||||||
|
def open_profile_view(self):
|
||||||
|
print self.open_profile_view
|
||||||
|
self.controls_widget.hide()
|
||||||
|
self.settings_widget.show()
|
||||||
|
|
||||||
def save_plot(self):
|
def save_plot(self):
|
||||||
file_choices = "PNG (*.png)|*.png"
|
file_choices = "PNG (*.png)|*.png"
|
||||||
|
|
||||||
filename = QtGui.QFileDialog.getSaveFileName(self, 'Save File', 'qtplot.png')
|
filename = QtGui.QFileDialog.getSaveFileName(self, 'Save File', 'qtplot.png')
|
||||||
print type(filename), dir(filename)
|
|
||||||
self.plotter.print_figure(str(filename), dpi=self.dpi)
|
self.plotter.print_figure(str(filename), dpi=self.dpi)
|
||||||
|
|
||||||
def fileQuit(self):
|
def fileQuit(self):
|
||||||
|
|
Loading…
Reference in New Issue