Desctivates canvas callbacks in drawing tool when deactivated.
This commit is contained in:
@@ -1393,11 +1393,13 @@ class App(QtCore.QObject):
|
|||||||
# TODO: Improve the serialization methods and remove this fix.
|
# TODO: Improve the serialization methods and remove this fix.
|
||||||
filename = str(filename)
|
filename = str(filename)
|
||||||
|
|
||||||
if str(filename) == "":
|
self.open_gerber(filename)
|
||||||
self.inform.emit("Open cancelled.")
|
|
||||||
else:
|
# if str(filename) == "":
|
||||||
self.worker_task.emit({'fcn': self.open_gerber,
|
# self.inform.emit("Open cancelled.")
|
||||||
'params': [filename]})
|
# else:
|
||||||
|
# self.worker_task.emit({'fcn': self.open_gerber,
|
||||||
|
# 'params': [filename]})
|
||||||
|
|
||||||
def on_fileopenexcellon(self):
|
def on_fileopenexcellon(self):
|
||||||
"""
|
"""
|
||||||
@@ -1557,14 +1559,10 @@ class App(QtCore.QObject):
|
|||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
App.log.debug("open_gerber()")
|
|
||||||
|
|
||||||
proc = self.proc_container.new("Opening Gerber")
|
|
||||||
self.progress.emit(10)
|
|
||||||
|
|
||||||
# How the object should be initialized
|
# How the object should be initialized
|
||||||
def obj_init(gerber_obj, app_obj):
|
def obj_init(gerber_obj, app_obj):
|
||||||
assert isinstance(gerber_obj, FlatCAMGerber)
|
assert isinstance(gerber_obj, FlatCAMGerber)
|
||||||
|
#log.debug("sys.getrefcount(proc) == %d" % sys.getrefcount(proc))
|
||||||
|
|
||||||
# Opening the file happens here
|
# Opening the file happens here
|
||||||
self.progress.emit(30)
|
self.progress.emit(30)
|
||||||
@@ -1584,6 +1582,14 @@ class App(QtCore.QObject):
|
|||||||
# Further parsing
|
# Further parsing
|
||||||
self.progress.emit(70) # TODO: Note the mixture of self and app_obj used here
|
self.progress.emit(70) # TODO: Note the mixture of self and app_obj used here
|
||||||
|
|
||||||
|
App.log.debug("open_gerber()")
|
||||||
|
|
||||||
|
proc = self.proc_container.new("Opening Gerber")
|
||||||
|
log.debug("sys.getrefcount(proc) == %d" % sys.getrefcount(proc))
|
||||||
|
self.progress.emit(10)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Object name
|
# Object name
|
||||||
name = outname or filename.split('/')[-1].split('\\')[-1]
|
name = outname or filename.split('/')[-1].split('\\')[-1]
|
||||||
|
|
||||||
@@ -1608,7 +1614,7 @@ class App(QtCore.QObject):
|
|||||||
self.file_opened.emit("gerber", filename)
|
self.file_opened.emit("gerber", filename)
|
||||||
|
|
||||||
self.progress.emit(100)
|
self.progress.emit(100)
|
||||||
proc.done()
|
#proc.done()
|
||||||
|
|
||||||
# GUI feedback
|
# GUI feedback
|
||||||
self.inform.emit("Opened: " + filename)
|
self.inform.emit("Opened: " + filename)
|
||||||
|
|||||||
@@ -442,7 +442,10 @@ class FCSelect(DrawTool):
|
|||||||
self.start_msg = "Click on geometry to select"
|
self.start_msg = "Click on geometry to select"
|
||||||
|
|
||||||
def click(self, point):
|
def click(self, point):
|
||||||
_, closest_shape = self.storage.nearest(point)
|
try:
|
||||||
|
_, closest_shape = self.storage.nearest(point)
|
||||||
|
except StopIteration:
|
||||||
|
return ""
|
||||||
|
|
||||||
if self.draw_app.key != 'control':
|
if self.draw_app.key != 'control':
|
||||||
self.draw_app.selected = []
|
self.draw_app.selected = []
|
||||||
@@ -575,11 +578,14 @@ class FlatCAMDraw(QtCore.QObject):
|
|||||||
self.app.ui.addToolBar(self.snap_toolbar)
|
self.app.ui.addToolBar(self.snap_toolbar)
|
||||||
|
|
||||||
### Event handlers ###
|
### Event handlers ###
|
||||||
## Canvas events
|
# Connection ids for Matplotlib
|
||||||
self.canvas.mpl_connect('button_press_event', self.on_canvas_click)
|
self.cid_canvas_click = None
|
||||||
self.canvas.mpl_connect('motion_notify_event', self.on_canvas_move)
|
self.cid_canvas_move = None
|
||||||
self.canvas.mpl_connect('key_press_event', self.on_canvas_key)
|
self.cid_canvas_key = None
|
||||||
self.canvas.mpl_connect('key_release_event', self.on_canvas_key_release)
|
self.cid_canvas_key_release = None
|
||||||
|
|
||||||
|
# Connect the canvas
|
||||||
|
#self.connect_canvas_event_handlers()
|
||||||
|
|
||||||
self.union_btn.triggered.connect(self.union)
|
self.union_btn.triggered.connect(self.union)
|
||||||
self.intersection_btn.triggered.connect(self.intersection)
|
self.intersection_btn.triggered.connect(self.intersection)
|
||||||
@@ -665,6 +671,19 @@ class FlatCAMDraw(QtCore.QObject):
|
|||||||
def activate(self):
|
def activate(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def connect_canvas_event_handlers(self):
|
||||||
|
## Canvas events
|
||||||
|
self.cid_canvas_click = self.canvas.mpl_connect('button_press_event', self.on_canvas_click)
|
||||||
|
self.cid_canvas_move = self.canvas.mpl_connect('motion_notify_event', self.on_canvas_move)
|
||||||
|
self.cid_canvas_key = self.canvas.mpl_connect('key_press_event', self.on_canvas_key)
|
||||||
|
self.cid_canvas_key_release = self.canvas.mpl_connect('key_release_event', self.on_canvas_key_release)
|
||||||
|
|
||||||
|
def disconnect_canvas_event_handlers(self):
|
||||||
|
self.canvas.mpl_disconnect(self.cid_canvas_click)
|
||||||
|
self.canvas.mpl_disconnect(self.cid_canvas_move)
|
||||||
|
self.canvas.mpl_disconnect(self.cid_canvas_key)
|
||||||
|
self.canvas.mpl_disconnect(self.cid_canvas_key_release)
|
||||||
|
|
||||||
def add_shape(self, shape):
|
def add_shape(self, shape):
|
||||||
"""
|
"""
|
||||||
Adds a shape to the shape storage.
|
Adds a shape to the shape storage.
|
||||||
@@ -690,6 +709,7 @@ class FlatCAMDraw(QtCore.QObject):
|
|||||||
self.storage.insert(shape)
|
self.storage.insert(shape)
|
||||||
|
|
||||||
def deactivate(self):
|
def deactivate(self):
|
||||||
|
self.disconnect_canvas_event_handlers()
|
||||||
self.clear()
|
self.clear()
|
||||||
self.drawing_toolbar.setDisabled(True)
|
self.drawing_toolbar.setDisabled(True)
|
||||||
self.snap_toolbar.setDisabled(True) # TODO: Combine and move into tool
|
self.snap_toolbar.setDisabled(True) # TODO: Combine and move into tool
|
||||||
@@ -740,6 +760,7 @@ class FlatCAMDraw(QtCore.QObject):
|
|||||||
assert isinstance(fcgeometry, Geometry)
|
assert isinstance(fcgeometry, Geometry)
|
||||||
|
|
||||||
self.clear()
|
self.clear()
|
||||||
|
self.connect_canvas_event_handlers()
|
||||||
self.select_tool("select")
|
self.select_tool("select")
|
||||||
|
|
||||||
# Link shapes into editor.
|
# Link shapes into editor.
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ class FCProcess(object):
|
|||||||
"done": []
|
"done": []
|
||||||
}
|
}
|
||||||
self.descr = descr
|
self.descr = descr
|
||||||
|
self.status = "Active"
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
# print "#######################"
|
# print "#######################"
|
||||||
@@ -17,6 +18,18 @@ class FCProcess(object):
|
|||||||
# print "#######################"
|
# print "#######################"
|
||||||
self.done()
|
self.done()
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
if exc_type is not None:
|
||||||
|
print "Abnormal termination of process!"
|
||||||
|
print exc_type
|
||||||
|
print exc_val
|
||||||
|
print exc_tb
|
||||||
|
|
||||||
|
self.done()
|
||||||
|
|
||||||
def done(self):
|
def done(self):
|
||||||
# print "FCProcess.done()"
|
# print "FCProcess.done()"
|
||||||
for fcn in self.callbacks["done"]:
|
for fcn in self.callbacks["done"]:
|
||||||
@@ -32,6 +45,9 @@ class FCProcess(object):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def set_status(self, status_string):
|
||||||
|
self.status = status_string
|
||||||
|
|
||||||
def status_msg(self):
|
def status_msg(self):
|
||||||
return self.descr
|
return self.descr
|
||||||
|
|
||||||
|
|||||||
20
camlib.py
20
camlib.py
@@ -2462,8 +2462,14 @@ class CNCjob(Geometry):
|
|||||||
"coordinate_format": "X%.4fY%.4f"
|
"coordinate_format": "X%.4fY%.4f"
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, units="in", kind="generic", z_move=0.1,
|
def __init__(self,
|
||||||
feedrate=3.0, z_cut=-0.002, tooldia=0.0, zdownrate=None):
|
units="in",
|
||||||
|
kind="generic",
|
||||||
|
z_move=0.1,
|
||||||
|
feedrate=3.0,
|
||||||
|
z_cut=-0.002,
|
||||||
|
tooldia=0.0,
|
||||||
|
zdownrate=None):
|
||||||
|
|
||||||
Geometry.__init__(self)
|
Geometry.__init__(self)
|
||||||
self.kind = kind
|
self.kind = kind
|
||||||
@@ -2556,6 +2562,8 @@ class CNCjob(Geometry):
|
|||||||
gcode += self.pausecode + "\n"
|
gcode += self.pausecode + "\n"
|
||||||
|
|
||||||
for tool in points:
|
for tool in points:
|
||||||
|
|
||||||
|
# Tool change sequence (optional)
|
||||||
if toolchange:
|
if toolchange:
|
||||||
gcode += "G00 Z%.4f\n" % toolchangez
|
gcode += "G00 Z%.4f\n" % toolchangez
|
||||||
gcode += "T%d\n" % int(tool) # Indicate tool slot (for automatic tool changer)
|
gcode += "T%d\n" % int(tool) # Indicate tool slot (for automatic tool changer)
|
||||||
@@ -2564,6 +2572,8 @@ class CNCjob(Geometry):
|
|||||||
gcode += "(MSG, Change to tool dia=%.4f)\n" % exobj.tools[tool]["C"]
|
gcode += "(MSG, Change to tool dia=%.4f)\n" % exobj.tools[tool]["C"]
|
||||||
gcode += "M0\n" # Temporary machine stop
|
gcode += "M0\n" # Temporary machine stop
|
||||||
gcode += "M3\n" # Spindle on clockwise
|
gcode += "M3\n" # Spindle on clockwise
|
||||||
|
|
||||||
|
# Drillling!
|
||||||
for point in points[tool]:
|
for point in points[tool]:
|
||||||
x, y = point.coords.xy
|
x, y = point.coords.xy
|
||||||
gcode += t % (x[0], y[0])
|
gcode += t % (x[0], y[0])
|
||||||
@@ -3500,6 +3510,12 @@ class FlatCAMRTree(object):
|
|||||||
self.rti.delete(self.obj2points[objid][i], (pt[0], pt[1], pt[0], pt[1]))
|
self.rti.delete(self.obj2points[objid][i], (pt[0], pt[1], pt[0], pt[1]))
|
||||||
|
|
||||||
def nearest(self, pt):
|
def nearest(self, pt):
|
||||||
|
"""
|
||||||
|
Will raise StopIteration if no items are found.
|
||||||
|
|
||||||
|
:param pt:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
return self.rti.nearest(pt, objects=True).next()
|
return self.rti.nearest(pt, objects=True).next()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from time import sleep
|
import sys
|
||||||
from PyQt4 import QtCore
|
from PyQt4 import QtCore, QtGui
|
||||||
from FlatCAMWorker import Worker
|
|
||||||
|
|
||||||
class MyObj():
|
class MyObj():
|
||||||
|
|
||||||
@@ -16,19 +16,19 @@ def parse():
|
|||||||
raise Exception("Intentional Exception")
|
raise Exception("Intentional Exception")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
class Example(QtGui.QWidget):
|
||||||
qo = QtCore.QObject
|
|
||||||
worker = Worker(qo)
|
|
||||||
thr1 = QtCore.QThread()
|
|
||||||
worker.moveToThread(thr1)
|
|
||||||
qo.connect(thr1, QtCore.SIGNAL("started()"), worker.run)
|
|
||||||
thr1.start()
|
|
||||||
|
|
||||||
while True:
|
def __init__(self):
|
||||||
try:
|
super(Example, self).__init__()
|
||||||
parse()
|
|
||||||
print "Parse returned."
|
qbtn = QtGui.QPushButton('Raise', self)
|
||||||
except Exception:
|
qbtn.clicked.connect(parse)
|
||||||
pass
|
|
||||||
sleep(5)
|
self.setWindowTitle('Quit button')
|
||||||
print "Competed successfully."
|
self.show()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = QtGui.QApplication(sys.argv)
|
||||||
|
ex = Example()
|
||||||
|
sys.exit(app.exec_())
|
||||||
Reference in New Issue
Block a user