FlatCAMProcess.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. from FlatCAMGUI import FlatCAMActivityView
  2. from PyQt4 import QtCore
  3. import weakref
  4. class FCProcess(object):
  5. def __init__(self, descr):
  6. self.callbacks = {
  7. "done": []
  8. }
  9. self.descr = descr
  10. self.status = "Active"
  11. def __del__(self):
  12. # print "#######################"
  13. # print "# FCProcess.__del__() #"
  14. # print "#######################"
  15. self.done()
  16. def __enter__(self):
  17. pass
  18. def __exit__(self, exc_type, exc_val, exc_tb):
  19. if exc_type is not None:
  20. print "Abnormal termination of process!"
  21. print exc_type
  22. print exc_val
  23. print exc_tb
  24. self.done()
  25. def done(self):
  26. # print "FCProcess.done()"
  27. for fcn in self.callbacks["done"]:
  28. fcn(self)
  29. def connect(self, callback, event="done"):
  30. if callback not in self.callbacks[event]:
  31. self.callbacks[event].append(callback)
  32. def disconnect(self, callback, event="done"):
  33. try:
  34. self.callbacks[event].remove(callback)
  35. except ValueError:
  36. pass
  37. def set_status(self, status_string):
  38. self.status = status_string
  39. def status_msg(self):
  40. return self.descr
  41. class FCProcessContainer(object):
  42. """
  43. This is the process container, or controller (as in MVC)
  44. of the Process/Activity tracking.
  45. FCProcessContainer keeps weak references to the FCProcess'es
  46. such that their __del__ method is called when the user
  47. looses track of their reference.
  48. """
  49. def __init__(self):
  50. self.procs = []
  51. def add(self, proc):
  52. self.procs.append(weakref.ref(proc))
  53. def new(self, descr):
  54. proc = FCProcess(descr)
  55. proc.connect(self.on_done, event="done")
  56. self.add(proc)
  57. self.on_change(proc)
  58. return proc
  59. def on_change(self, proc):
  60. pass
  61. def on_done(self, proc):
  62. self.remove(proc)
  63. def remove(self, proc):
  64. to_be_removed = []
  65. for pref in self.procs:
  66. if pref() == proc or pref() is None:
  67. to_be_removed.append(pref)
  68. for pref in to_be_removed:
  69. self.procs.remove(pref)
  70. class FCVisibleProcessContainer(QtCore.QObject, FCProcessContainer):
  71. something_changed = QtCore.pyqtSignal()
  72. def __init__(self, view):
  73. assert isinstance(view, FlatCAMActivityView)
  74. FCProcessContainer.__init__(self)
  75. QtCore.QObject.__init__(self)
  76. self.view = view
  77. self.something_changed.connect(self.update_view)
  78. def on_done(self, proc):
  79. print "FCVisibleProcessContainer.on_done()"
  80. super(FCVisibleProcessContainer, self).on_done(proc)
  81. #self.update_view()
  82. self.something_changed.emit()
  83. def on_change(self, proc):
  84. print "FCVisibleProcessContainer.on_change()"
  85. super(FCVisibleProcessContainer, self).on_change(proc)
  86. #self.update_view()
  87. self.something_changed.emit()
  88. def update_view(self):
  89. # print "FCVisibleProcessContainer.update_view()"
  90. if len(self.procs) == 0:
  91. self.view.set_idle()
  92. elif len(self.procs) == 1:
  93. self.view.set_busy(self.procs[0]().status_msg())
  94. else:
  95. self.view.set_busy("%d processes running." % len(self.procs))