- made the polygon fusing in modified Gerber creation, a list comprehension in an attempt for optimization
- when right clicking the files in Project tab, the Save option for Excellon no longer export it but really save the original.
This commit is contained in:
parent
7b4ea1dfa9
commit
18132eab4c
|
@ -5016,11 +5016,11 @@ class App(QtCore.QObject):
|
||||||
if type(obj) == FlatCAMGeometry:
|
if type(obj) == FlatCAMGeometry:
|
||||||
self.on_file_exportdxf()
|
self.on_file_exportdxf()
|
||||||
elif type(obj) == FlatCAMExcellon:
|
elif type(obj) == FlatCAMExcellon:
|
||||||
self.on_file_exportexcellon()
|
self.on_file_saveexcellon()
|
||||||
elif type(obj) == FlatCAMCNCjob:
|
elif type(obj) == FlatCAMCNCjob:
|
||||||
obj.on_exportgcode_button_click()
|
obj.on_exportgcode_button_click()
|
||||||
elif type(obj) == FlatCAMGerber:
|
elif type(obj) == FlatCAMGerber:
|
||||||
self.on_file_exportgerber()
|
self.on_file_savegerber()
|
||||||
|
|
||||||
def on_view_source(self):
|
def on_view_source(self):
|
||||||
|
|
||||||
|
@ -5294,18 +5294,18 @@ class App(QtCore.QObject):
|
||||||
write_png(filename, data)
|
write_png(filename, data)
|
||||||
self.file_saved.emit("png", filename)
|
self.file_saved.emit("png", filename)
|
||||||
|
|
||||||
def on_file_exportgerber(self):
|
def on_file_savegerber(self):
|
||||||
"""
|
"""
|
||||||
Callback for menu item File->Export SVG.
|
Callback for menu item File->Export Gerber.
|
||||||
|
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
self.report_usage("on_file_exportgerber")
|
self.report_usage("on_file_savegerber")
|
||||||
App.log.debug("on_file_exportgerber()")
|
App.log.debug("on_file_savegerber()")
|
||||||
|
|
||||||
obj = self.collection.get_active()
|
obj = self.collection.get_active()
|
||||||
if obj is None:
|
if obj is None:
|
||||||
self.inform.emit("[WARNING_NOTCL] No object selected. Please Select an Gerber object to export.")
|
self.inform.emit("[WARNING_NOTCL] No object selected. Please select an Gerber object to export.")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Check for more compatible types and add as required
|
# Check for more compatible types and add as required
|
||||||
|
@ -5318,21 +5318,60 @@ class App(QtCore.QObject):
|
||||||
filter = "Gerber File (*.GBR);;Gerber File (*.GRB);;All Files (*.*)"
|
filter = "Gerber File (*.GBR);;Gerber File (*.GRB);;All Files (*.*)"
|
||||||
try:
|
try:
|
||||||
filename, _ = QtWidgets.QFileDialog.getSaveFileName(
|
filename, _ = QtWidgets.QFileDialog.getSaveFileName(
|
||||||
caption="Export Gerber",
|
caption="Save Gerber source file",
|
||||||
directory=self.get_last_save_folder() + '/' + name,
|
directory=self.get_last_save_folder() + '/' + name,
|
||||||
filter=filter)
|
filter=filter)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export Gerber", filter=filter)
|
filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Save Gerber source file", filter=filter)
|
||||||
|
|
||||||
filename = str(filename)
|
filename = str(filename)
|
||||||
|
|
||||||
if filename == "":
|
if filename == "":
|
||||||
self.inform.emit("[WARNING_NOTCL]Export Gerber cancelled.")
|
self.inform.emit("[WARNING_NOTCL]Save Gerber source file cancelled.")
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
self.export_gerber(name, filename)
|
self.save_source_file(name, filename)
|
||||||
self.file_saved.emit("Gerber", filename)
|
self.file_saved.emit("Gerber", filename)
|
||||||
|
|
||||||
|
def on_file_saveexcellon(self):
|
||||||
|
"""
|
||||||
|
Callback for menu item File->Export Gerber.
|
||||||
|
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
self.report_usage("on_file_saveexcellon")
|
||||||
|
App.log.debug("on_file_saveexcellon()")
|
||||||
|
|
||||||
|
obj = self.collection.get_active()
|
||||||
|
if obj is None:
|
||||||
|
self.inform.emit("[WARNING_NOTCL] No object selected. Please select an Excellon object to export.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Check for more compatible types and add as required
|
||||||
|
if not isinstance(obj, FlatCAMExcellon):
|
||||||
|
self.inform.emit("[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files...")
|
||||||
|
return
|
||||||
|
|
||||||
|
name = self.collection.get_active().options["name"]
|
||||||
|
|
||||||
|
filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)"
|
||||||
|
try:
|
||||||
|
filename, _ = QtWidgets.QFileDialog.getSaveFileName(
|
||||||
|
caption="Save Excellon source file",
|
||||||
|
directory=self.get_last_save_folder() + '/' + name,
|
||||||
|
filter=filter)
|
||||||
|
except TypeError:
|
||||||
|
filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Save Excellon source file", filter=filter)
|
||||||
|
|
||||||
|
filename = str(filename)
|
||||||
|
|
||||||
|
if filename == "":
|
||||||
|
self.inform.emit("[WARNING_NOTCL]Saving Excellon source file cancelled.")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.save_source_file(name, filename)
|
||||||
|
self.file_saved.emit("Excellon", filename)
|
||||||
|
|
||||||
def on_file_exportexcellon(self):
|
def on_file_exportexcellon(self):
|
||||||
"""
|
"""
|
||||||
Callback for menu item File->Export SVG.
|
Callback for menu item File->Export SVG.
|
||||||
|
@ -5885,19 +5924,19 @@ class App(QtCore.QObject):
|
||||||
else:
|
else:
|
||||||
make_black_film()
|
make_black_film()
|
||||||
|
|
||||||
def export_gerber(self, obj_name, filename, use_thread=True):
|
def save_source_file(self, obj_name, filename, use_thread=True):
|
||||||
"""
|
"""
|
||||||
Exports a Gerber Object to an Gerber file.
|
Exports a Gerber Object to an Gerber file.
|
||||||
|
|
||||||
:param filename: Path to the Gerber file to save to.
|
:param filename: Path to the Gerber file to save to.
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
self.report_usage("export_gerber()")
|
self.report_usage("save source file()")
|
||||||
|
|
||||||
if filename is None:
|
if filename is None:
|
||||||
filename = self.defaults["global_last_save_folder"]
|
filename = self.defaults["global_last_save_folder"]
|
||||||
|
|
||||||
self.log.debug("export_gerber()")
|
self.log.debug("save source file()")
|
||||||
|
|
||||||
obj = self.collection.get_by_name(obj_name)
|
obj = self.collection.get_by_name(obj_name)
|
||||||
|
|
||||||
|
@ -5906,8 +5945,8 @@ class App(QtCore.QObject):
|
||||||
|
|
||||||
with open(filename, 'w') as file:
|
with open(filename, 'w') as file:
|
||||||
file.writelines('G04*\n')
|
file.writelines('G04*\n')
|
||||||
file.writelines('G04 GERBER (RE)GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s*\n' %
|
file.writelines('G04 %s (RE)GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s*\n' %
|
||||||
(str(self.version), str(self.version_date)))
|
(obj.kind.upper(), str(self.version), str(self.version_date)))
|
||||||
file.writelines('G04 Filename: %s*\n' % str(obj_name))
|
file.writelines('G04 Filename: %s*\n' % str(obj_name))
|
||||||
file.writelines('G04 Created on : %s*\n' % time_string)
|
file.writelines('G04 Created on : %s*\n' % time_string)
|
||||||
|
|
||||||
|
|
|
@ -708,6 +708,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
break
|
break
|
||||||
|
|
||||||
if self.ui.apertures_table.cellWidget(check_row, 5).isChecked():
|
if self.ui.apertures_table.cellWidget(check_row, 5).isChecked():
|
||||||
|
# self.plot_apertures(color='#FF0000BF', marked_aperture=aperture, visible=True)
|
||||||
self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
|
self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
|
||||||
|
|
||||||
self.mark_shapes.redraw()
|
self.mark_shapes.redraw()
|
||||||
|
@ -738,6 +739,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
mark_cb.setChecked(False)
|
mark_cb.setChecked(False)
|
||||||
for aperture in self.apertures:
|
for aperture in self.apertures:
|
||||||
if mark_all:
|
if mark_all:
|
||||||
|
# self.plot_apertures(color='#FF0000BF', marked_aperture=aperture, visible=True)
|
||||||
self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
|
self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
|
||||||
else:
|
else:
|
||||||
self.mark_shapes.clear(update=True)
|
self.mark_shapes.clear(update=True)
|
||||||
|
@ -1132,7 +1134,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
assert isinstance(gerber_obj, FlatCAMGerber), \
|
assert isinstance(gerber_obj, FlatCAMGerber), \
|
||||||
"Expected to initialize a FlatCAMGerber but got %s" % type(gerber_obj)
|
"Expected to initialize a FlatCAMGerber but got %s" % type(gerber_obj)
|
||||||
|
|
||||||
gerber_obj.source_file = ''
|
gerber_obj.source_file = self.source_file
|
||||||
gerber_obj.multigeo = False
|
gerber_obj.multigeo = False
|
||||||
gerber_obj.follow = False
|
gerber_obj.follow = False
|
||||||
|
|
||||||
|
@ -1145,9 +1147,10 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
|
|
||||||
# regenerate solid_geometry
|
# regenerate solid_geometry
|
||||||
app_obj.log.debug("Creating new Gerber object. Joining %s polygons.")
|
app_obj.log.debug("Creating new Gerber object. Joining %s polygons.")
|
||||||
for ap in apertures:
|
# for ap in apertures:
|
||||||
for geo in apertures[ap]['solid_geometry']:
|
# for geo in apertures[ap]['solid_geometry']:
|
||||||
poly_buff.append(geo)
|
# poly_buff.append(geo)
|
||||||
|
poly_buff = [geo for ap in apertures for geo in apertures[ap]['solid_geometry']]
|
||||||
|
|
||||||
# buffering the poly_buff
|
# buffering the poly_buff
|
||||||
new_geo = MultiPolygon(poly_buff)
|
new_geo = MultiPolygon(poly_buff)
|
||||||
|
@ -1294,6 +1297,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
visibility = kwargs['visible']
|
visibility = kwargs['visible']
|
||||||
|
|
||||||
with self.app.proc_container.new("Plotting Apertures") as proc:
|
with self.app.proc_container.new("Plotting Apertures") as proc:
|
||||||
|
self.app.progress.emit(30)
|
||||||
|
|
||||||
def job_thread(app_obj):
|
def job_thread(app_obj):
|
||||||
geometry = {}
|
geometry = {}
|
||||||
for ap in self.apertures:
|
for ap in self.apertures:
|
||||||
|
@ -1302,26 +1307,24 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
_ = iter(geometry[int(ap)])
|
_ = iter(geometry[int(ap)])
|
||||||
except TypeError:
|
except TypeError:
|
||||||
geometry[int(ap)] = [geometry[int(ap)]]
|
geometry[int(ap)] = [geometry[int(ap)]]
|
||||||
self.app.progress.emit(10)
|
self.app.progress.emit(30)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if aperture_to_plot_mark in self.apertures:
|
if aperture_to_plot_mark in self.apertures:
|
||||||
for geo in geometry[int(aperture_to_plot_mark)]:
|
for geo in geometry[int(aperture_to_plot_mark)]:
|
||||||
if type(geo) == Polygon or type(geo) == LineString:
|
if type(geo) == Polygon or type(geo) == LineString:
|
||||||
self.add_mark_shape(shape=geo, color=color,
|
self.add_mark_shape(shape=geo, color=color, face_color=color, visible=visibility)
|
||||||
face_color=color, visible=visibility)
|
|
||||||
else:
|
else:
|
||||||
for el in geo:
|
for el in geo:
|
||||||
self.add_mark_shape(shape=el, color=color,
|
self.add_mark_shape(shape=el, color=color, face_color=color, visible=visibility)
|
||||||
face_color=color, visible=visibility)
|
|
||||||
|
|
||||||
self.mark_shapes.redraw()
|
self.mark_shapes.redraw()
|
||||||
self.app.progress.emit(90)
|
self.app.progress.emit(100)
|
||||||
|
|
||||||
except (ObjectDeleted, AttributeError):
|
except (ObjectDeleted, AttributeError):
|
||||||
self.mark_shapes.clear(update=True)
|
self.mark_shapes.clear(update=True)
|
||||||
|
|
||||||
self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]})
|
self.app.worker_task.emit({'fcn': job_thread, 'params': [self]})
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -18,6 +18,8 @@ CAD program, and create G-Code for Isolation routing.
|
||||||
- fixed Gerber Aperture Table dimensions
|
- fixed Gerber Aperture Table dimensions
|
||||||
- added a Mark All button in the Gerber aperture table.
|
- added a Mark All button in the Gerber aperture table.
|
||||||
- because adding shapes to the shapes collection (when doing Mark or Mark All) is time consuming I made the plot_apertures() threaded.
|
- because adding shapes to the shapes collection (when doing Mark or Mark All) is time consuming I made the plot_apertures() threaded.
|
||||||
|
- made the polygon fusing in modified Gerber creation, a list comprehension in an attempt for optimization
|
||||||
|
- when right clicking the files in Project tab, the Save option for Excellon no longer export it but really save the original.
|
||||||
|
|
||||||
25.02.2019
|
25.02.2019
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue