- fixed the Tcl Command AlignDrill

- fixed the Tcl Command AlignDrillGrid
- fixed the Tcl COmmand Panelize, Excellon panelization section
- Fixed an issue in Tool Calibration export_excellon method call
- PEP8 corrections all over the app
This commit is contained in:
Marius Stanciu
2020-11-02 03:32:00 +02:00
committed by Marius
parent fac4caf961
commit 374c29b4b0
63 changed files with 492 additions and 537 deletions

View File

@@ -383,7 +383,7 @@ class AlignUI:
grid0.setColumnStretch(1, 1)
self.layout.addLayout(grid0)
self.aligned_label =FCLabel('<b>%s:</b>' % _("MOVING object"))
self.aligned_label = FCLabel('<b>%s:</b>' % _("MOVING object"))
grid0.addWidget(self.aligned_label, 0, 0, 1, 2)
self.aligned_label.setToolTip(
@@ -478,7 +478,7 @@ class AlignUI:
grid0.addWidget(separator_line, 14, 0, 1, 2)
# Buttons
self.align_object_button =FCButton(_("Align Object"))
self.align_object_button = FCButton(_("Align Object"))
self.align_object_button.setIcon(QtGui.QIcon(self.app.resource_location + '/align16.png'))
self.align_object_button.setToolTip(
_("Align the specified object to the aligner object.\n"

View File

@@ -639,7 +639,7 @@ class ToolCalibration(AppTool):
if obj.tools:
obj_init.tools = deepcopy(obj.tools)
except Exception as ee:
log.debug("ToolCalibration.new_calibrated_object.initialize_geometry() --> %s" % str(ee))
app.log.debug("ToolCalibration.new_calibrated_object.initialize_geometry() --> %s" % str(ee))
obj_init.scale(xfactor=scalex, yfactor=scaley, point=(origin_x, origin_y))
obj_init.skew(angle_x=skewx, angle_y=skewy, point=(origin_x, origin_y))
@@ -649,7 +649,7 @@ class ToolCalibration(AppTool):
except (AttributeError, TypeError):
pass
def initialize_gerber(obj_init, app):
def initialize_gerber(obj_init, app_obj):
obj_init.solid_geometry = deepcopy(obj.solid_geometry)
try:
obj_init.follow_geometry = deepcopy(obj.follow_geometry)
@@ -671,12 +671,12 @@ class ToolCalibration(AppTool):
obj_init.skew(angle_x=skewx, angle_y=skewy, point=(origin_x, origin_y))
try:
obj_init.source_file = self.app.f_handlers.export_gerber(obj_name=obj_name, filename=None,
local_use=obj_init, use_thread=False)
obj_init.source_file = app_obj.f_handlers.export_gerber(obj_name=obj_name, filename=None,
local_use=obj_init, use_thread=False)
except (AttributeError, TypeError):
pass
def initialize_excellon(obj_init, app):
def initialize_excellon(obj_init, app_obj):
obj_init.tools = deepcopy(obj.tools)
# drills are offset, so they need to be deep copied
@@ -689,8 +689,8 @@ class ToolCalibration(AppTool):
obj_init.create_geometry()
obj_init.source_file = self.app.export.export_excellon(obj_name=obj_name, local_use=obj, filename=None,
use_thread=False)
obj_init.source_file = app_obj.f_handlers.export_excellon(obj_name=obj_name, local_use=obj, filename=None,
use_thread=False)
obj = self.cal_object
obj_name = obj_name

View File

@@ -245,9 +245,7 @@ class ToolCopperThieving(AppTool):
break
if aperture_found:
geo_elem = {}
geo_elem['solid'] = self.robber_geo
geo_elem['follow'] = self.robber_line
geo_elem = {'solid': self.robber_geo, 'follow': self.robber_line}
self.grb_object.apertures[aperture_found]['geometry'].append(deepcopy(geo_elem))
else:
ap_keys = list(self.grb_object.apertures.keys())
@@ -261,9 +259,7 @@ class ToolCopperThieving(AppTool):
self.grb_object.apertures[new_apid]['size'] = self.rb_thickness
self.grb_object.apertures[new_apid]['geometry'] = []
geo_elem = {}
geo_elem['solid'] = self.robber_geo
geo_elem['follow'] = self.robber_line
geo_elem = {'solid': self.robber_geo, 'follow': self.robber_line}
self.grb_object.apertures[new_apid]['geometry'].append(deepcopy(geo_elem))
geo_obj = self.grb_object.solid_geometry
@@ -857,18 +853,14 @@ class ToolCopperThieving(AppTool):
geo_list.append(poly)
# append into the '0' aperture
geo_elem = {}
geo_elem['solid'] = poly
geo_elem['follow'] = poly.exterior
geo_elem = {'solid': poly, 'follow': poly.exterior}
app_obj.grb_object.apertures['0']['geometry'].append(deepcopy(geo_elem))
except TypeError:
# append to the new solid geometry
geo_list.append(app_obj.new_solid_geometry)
# append into the '0' aperture
geo_elem = {}
geo_elem['solid'] = app_obj.new_solid_geometry
geo_elem['follow'] = app_obj.new_solid_geometry.exterior
geo_elem = {'solid': app_obj.new_solid_geometry, 'follow': app_obj.new_solid_geometry.exterior}
app_obj.grb_object.apertures['0']['geometry'].append(deepcopy(geo_elem))
app_obj.grb_object.solid_geometry = MultiPolygon(geo_list).buffer(0.0000001).buffer(-0.0000001)
@@ -993,9 +985,7 @@ class ToolCopperThieving(AppTool):
break
if aperture_found:
geo_elem = {}
geo_elem['solid'] = robber_solid_geo
geo_elem['follow'] = robber_line
geo_elem = {'solid': robber_solid_geo, 'follow': robber_line}
grb_obj.apertures[aperture_found]['geometry'].append(deepcopy(geo_elem))
else:
ap_keys = list(grb_obj.apertures.keys())

View File

@@ -264,9 +264,7 @@ class ToolCorners(AppTool):
geo_buff = geo.buffer(line_thickness / 2.0, resolution=self.grb_steps_per_circle, join_style=2)
geo_buff_list.append(geo_buff)
dict_el = {}
dict_el['follow'] = geo
dict_el['solid'] = geo_buff
dict_el = {'follow': geo, 'solid': geo_buff}
new_apertures[aperture_found]['geometry'].append(deepcopy(dict_el))
else:
ap_keys = list(new_apertures.keys())
@@ -674,4 +672,4 @@ class CornersUI:
self.app.inform[str, bool].emit('[WARNING_NOTCL] %s: [%d, %d]' %
(_("Edited value is out of range"), minval, maxval), False)
else:
self.app.inform[str, bool].emit('[success] %s' % _("Edited value is within limits."), False)
self.app.inform[str, bool].emit('[success] %s' % _("Edited value is within limits."), False)

View File

@@ -389,7 +389,7 @@ class CutOut(AppTool):
def on_tool_default_add(self, dia=None, muted=None):
dia = dia
dia = dia if dia else str(self.app.defaults["tools_cutout_tooldia"])
self.default_data.update({
"plot": True,
@@ -442,7 +442,7 @@ class CutOut(AppTool):
})
self.cut_tool_dict.update({
'tooldia': str(self.app.defaults["tools_cutout_tooldia"]),
'tooldia': dia,
'offset': 'Path',
'offset_value': 0.0,
'type': _('Rough'),
@@ -874,16 +874,18 @@ class CutOut(AppTool):
if not holes:
return 'fail'
tools = {}
tools[1] = {}
tools[1]["tooldia"] = mb_dia
tools[1]['drills'] = holes
tools[1]['solid_geometry'] = []
tools = {
1: {
"tooldia": mb_dia,
"drills": holes,
"solid_geometry": []
}
}
exc_obj.tools = tools
exc_obj.create_geometry()
exc_obj.source_file = app_o.f_handlers.export_excellon(obj_name=exc_obj.options['name'],
local_use=exc_obj,filename=None,
local_use=exc_obj, filename=None,
use_thread=False)
# calculate the bounds
xmin, ymin, xmax, ymax = CutOut.recursive_bounds(exc_obj.solid_geometry)
@@ -1244,11 +1246,13 @@ class CutOut(AppTool):
if not holes:
return 'fail'
tools = {}
tools[1] = {}
tools[1]["tooldia"] = mb_dia
tools[1]['drills'] = holes
tools[1]['solid_geometry'] = []
tools = {
1: {
"tooldia": mb_dia,
"drills": holes,
"solid_geometry": []
}
}
exc_obj.tools = tools
exc_obj.create_geometry()
@@ -1602,11 +1606,13 @@ class CutOut(AppTool):
if not holes:
return 'fail'
tools = {}
tools[1] = {}
tools[1]["tooldia"] = mb_dia
tools[1]['drills'] = holes
tools[1]['solid_geometry'] = []
tools = {
1: {
"tooldia": mb_dia,
"drills": holes,
"solid_geometry": []
}
}
exc_obj.tools = tools
exc_obj.create_geometry()

View File

@@ -190,9 +190,9 @@ class ToolEtchCompensation(AppTool):
# update the apertures attributes (keys in the apertures dict)
for ap in new_apertures:
type = new_apertures[ap]['type']
ap_type = new_apertures[ap]['type']
for k in new_apertures[ap]:
if type == 'R' or type == 'O':
if ap_type == 'R' or ap_type == 'O':
if k == 'width' or k == 'height':
new_apertures[ap][k] += offset
else:
@@ -207,9 +207,9 @@ class ToolEtchCompensation(AppTool):
# in case of 'R' or 'O' aperture type we need to update the aperture 'size' after
# the 'width' and 'height' keys were updated
for ap in new_apertures:
type = new_apertures[ap]['type']
ap_type = new_apertures[ap]['type']
for k in new_apertures[ap]:
if type == 'R' or type == 'O':
if ap_type == 'R' or ap_type == 'O':
if k == 'size':
new_apertures[ap][k] = math.sqrt(
new_apertures[ap]['width'] ** 2 + new_apertures[ap]['height'] ** 2)
@@ -233,8 +233,8 @@ class ToolEtchCompensation(AppTool):
new_obj.apertures = deepcopy(new_apertures)
new_obj.solid_geometry = deepcopy(new_solid_geometry)
new_obj.source_file = self.app.f_handlers.export_gerber(obj_name=outname, filename=None, local_use=new_obj,
use_thread=False)
new_obj.source_file = app_obj.f_handlers.export_gerber(obj_name=outname, filename=None, local_use=new_obj,
use_thread=False)
self.app.app_obj.new_object('gerber', outname, init_func)

View File

@@ -270,9 +270,7 @@ class ToolFiducials(AppTool):
if aperture_found:
for geo in geo_list:
dict_el = {}
dict_el['follow'] = geo.centroid
dict_el['solid'] = geo
dict_el = {'follow': geo.centroid, 'solid': geo}
g_obj.apertures[aperture_found]['geometry'].append(deepcopy(dict_el))
else:
ap_keys = list(g_obj.apertures.keys())
@@ -287,9 +285,7 @@ class ToolFiducials(AppTool):
g_obj.apertures[new_apid]['geometry'] = []
for geo in geo_list:
dict_el = {}
dict_el['follow'] = geo.centroid
dict_el['solid'] = geo
dict_el = {'follow': geo.centroid, 'solid': geo}
g_obj.apertures[new_apid]['geometry'].append(deepcopy(dict_el))
s_list = []
@@ -330,9 +326,7 @@ class ToolFiducials(AppTool):
geo_buff_list.append(geo_buff_h)
geo_buff_list.append(geo_buff_v)
dict_el = {}
dict_el['follow'] = geo_buff_h.centroid
dict_el['solid'] = geo_buff_h
dict_el = {'follow': geo_buff_h.centroid, 'solid': geo_buff_h}
g_obj.apertures[aperture_found]['geometry'].append(deepcopy(dict_el))
dict_el['follow'] = geo_buff_v.centroid
dict_el['solid'] = geo_buff_v
@@ -344,10 +338,11 @@ class ToolFiducials(AppTool):
else:
new_apid = '10'
g_obj.apertures[new_apid] = {}
g_obj.apertures[new_apid]['type'] = 'C'
g_obj.apertures[new_apid]['size'] = line_thickness
g_obj.apertures[new_apid]['geometry'] = []
g_obj.apertures[new_apid] = {
'type': 'C',
'size': line_thickness,
'geometry': []
}
for geo in geo_list:
geo_buff_h = geo[0].buffer(line_thickness / 2.0, self.grb_steps_per_circle)
@@ -355,9 +350,7 @@ class ToolFiducials(AppTool):
geo_buff_list.append(geo_buff_h)
geo_buff_list.append(geo_buff_v)
dict_el = {}
dict_el['follow'] = geo_buff_h.centroid
dict_el['solid'] = geo_buff_h
dict_el = {'follow': geo_buff_h.centroid, 'solid': geo_buff_h}
g_obj.apertures[new_apid]['geometry'].append(deepcopy(dict_el))
dict_el['follow'] = geo_buff_v.centroid
dict_el['solid'] = geo_buff_v
@@ -412,9 +405,7 @@ class ToolFiducials(AppTool):
for geo in geo_list:
geo_buff_list.append(geo)
dict_el = {}
dict_el['follow'] = geo.centroid
dict_el['solid'] = geo
dict_el = {'follow': geo.centroid, 'solid': geo}
g_obj.apertures[aperture_found]['geometry'].append(deepcopy(dict_el))
else:
ap_keys = list(g_obj.apertures.keys())
@@ -423,19 +414,18 @@ class ToolFiducials(AppTool):
else:
new_apid = '10'
g_obj.apertures[new_apid] = {}
g_obj.apertures[new_apid]['type'] = 'R'
g_obj.apertures[new_apid]['size'] = new_ap_size
g_obj.apertures[new_apid]['width'] = fid_size
g_obj.apertures[new_apid]['height'] = fid_size
g_obj.apertures[new_apid]['geometry'] = []
g_obj.apertures[new_apid] = {
'type': 'R',
'size': new_ap_size,
'width': fid_size,
'height': fid_size,
'geometry': []
}
for geo in geo_list:
geo_buff_list.append(geo)
dict_el = {}
dict_el['follow'] = geo.centroid
dict_el['solid'] = geo
dict_el = {'follow': geo.centroid, 'solid': geo}
g_obj.apertures[new_apid]['geometry'].append(deepcopy(dict_el))
s_list = []

View File

@@ -613,7 +613,8 @@ class Film(AppTool):
drawing = svg2rlg(doc_final)
p_size = self.ui.pagesize_combo.get_value()
if p_size == 'Bounds': renderPDF.drawToFile(drawing, filename)
if p_size == 'Bounds':
renderPDF.drawToFile(drawing, filename)
else:
if self.ui.orientation_radio.get_value() == 'p':
page_size = portrait(self.ui.pagesize[p_size])

View File

@@ -79,11 +79,10 @@ class ToolImage(AppTool):
def on_file_importimage(self):
"""
Callback for menu item File->Import IMAGE.
:param type_of_obj: to import the IMAGE as Geometry or as Gerber
:type type_of_obj: str
:return: None
"""
mask = []
self.app.log.debug("on_file_importimage()")
_filter = "Image Files(*.BMP *.PNG *.JPG *.JPEG);;" \
@@ -147,7 +146,7 @@ class ToolImage(AppTool):
geo_obj.import_image(filename, units=units, dpi=dpi, mode=mode, mask=mask)
geo_obj.multigeo = False
with self.app.proc_container.new(_("Importing Image")) as proc:
with self.app.proc_container.new(_("Importing Image")):
# Object name
name = outname or filename.split('/')[-1].split('\\')[-1]

View File

@@ -131,21 +131,18 @@ class ToolInvertGerber(AppTool):
new_apertures = {}
if '0' not in new_apertures:
new_apertures['0'] = {}
new_apertures['0']['type'] = 'C'
new_apertures['0']['size'] = 0.0
new_apertures['0']['geometry'] = []
new_apertures['0'] = {
'type': 'C',
'size': 0.0,
'geometry': []
}
try:
for poly in new_solid_geometry:
new_el = {}
new_el['solid'] = poly
new_el['follow'] = poly.exterior
new_el = {'solid': poly, 'follow': poly.exterior}
new_apertures['0']['geometry'].append(new_el)
except TypeError:
new_el = {}
new_el['solid'] = new_solid_geometry
new_el['follow'] = new_solid_geometry.exterior
new_el = {'solid': new_solid_geometry, 'follow': new_solid_geometry.exterior}
new_apertures['0']['geometry'].append(new_el)
def init_func(new_obj, app_obj):
@@ -157,8 +154,8 @@ class ToolInvertGerber(AppTool):
new_obj.apertures = deepcopy(new_apertures)
new_obj.solid_geometry = deepcopy(new_solid_geometry)
new_obj.source_file = self.app.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
new_obj.source_file = app_obj.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
self.app.app_obj.new_object('gerber', outname, init_func)
@@ -315,4 +312,4 @@ class InvertUI:
self.app.inform[str, bool].emit('[WARNING_NOTCL] %s: [%d, %d]' %
(_("Edited value is out of range"), minval, maxval), False)
else:
self.app.inform[str, bool].emit('[success] %s' % _("Edited value is within limits."), False)
self.app.inform[str, bool].emit('[success] %s' % _("Edited value is within limits."), False)

View File

@@ -793,8 +793,8 @@ class ToolIsolation(AppTool, Gerber):
parent=self.app.ui)
tool_add_popup.setWindowIcon(QtGui.QIcon(self.app.resource_location + '/letter_t_32.png'))
def find_optimal(val):
tool_add_popup.set_value(float(val))
def find_optimal(valor):
tool_add_popup.set_value(float(valor))
self.optimal_found_sig.connect(find_optimal)
@@ -1620,8 +1620,7 @@ class ToolIsolation(AppTool, Gerber):
self.app.proc_container.update_view_text(' %s' % _("Subtracting Geo"))
geo_obj.solid_geometry = self.area_subtraction(geo_obj.solid_geometry)
geo_obj.tools = {}
geo_obj.tools['1'] = {}
geo_obj.tools = {'1': {}}
geo_obj.tools.update({
'1': {
'tooldia': float(tool_dia),

View File

@@ -635,7 +635,7 @@ class ToolMilling(AppTool, Excellon):
# Get source object.
try:
self.excellon_obj = self.app.collection.get_by_name(self.obj_name)
except Exception as e:
except Exception:
self.app.inform.emit('[ERROR_NOTCL] %s: %s' % (_("Could not retrieve object"), str(self.obj_name)))
return

View File

@@ -160,7 +160,7 @@ class ToolMove(AppTool):
if obj.options['plot'] and obj.visible is True]
def job_move(app_obj):
with self.app.proc_container.new(_("Moving...")) as proc:
with self.app.proc_container.new(_("Moving...")):
if not obj_list:
app_obj.app.inform.emit('[WARNING_NOTCL] %s' % _("No object(s) selected."))

View File

@@ -109,9 +109,10 @@ class ToolPDF(AppTool):
short_name = filename.split('/')[-1].split('\\')[-1]
self.parsing_promises.append(short_name)
self.pdf_parsed[short_name] = {}
self.pdf_parsed[short_name]['pdf'] = {}
self.pdf_parsed[short_name]['filename'] = filename
self.pdf_parsed[short_name] = {
'pdf': {},
'filename': filename
}
self.pdf_decompressed[short_name] = ''
@@ -181,22 +182,26 @@ class ToolPDF(AppTool):
name_tool = 0
for dia in sorted_dia:
name_tool += 1
tool = str(name_tool)
# create tools dictionary
spec = {"C": dia, 'solid_geometry': []}
exc_obj.tools[str(name_tool)] = spec
exc_obj.tools[tool] = {
'tooldia': dia,
'drills': [],
'solid_geometry': []
}
# create drill list of dictionaries
# update the drill list
for dia_points in points:
if dia == dia_points:
for pt in points[dia_points]:
exc_obj.drills.append({'point': Point(pt), 'tool': str(name_tool)})
exc_obj.tools[tool]['drills'].append(Point(pt))
break
ret = exc_obj.create_geometry()
if ret == 'fail':
log.debug("Could not create geometry for Excellon object.")
return "fail"
for tool in exc_obj.tools:
if exc_obj.tools[tool]['solid_geometry']:
return

View File

@@ -472,14 +472,14 @@ class ToolPunchGerber(AppTool):
# since there may be drills that do not drill into a pad we test only for
# drills in a pad
if drill_pt.within(elem['solid']):
geo_elem = {}
geo_elem['clear'] = drill_pt
geo_elem = {'clear': drill_pt}
if clear_apid_size not in holes_apertures:
holes_apertures[clear_apid_size] = {}
holes_apertures[clear_apid_size]['type'] = 'C'
holes_apertures[clear_apid_size]['size'] = clear_apid_size
holes_apertures[clear_apid_size]['geometry'] = []
holes_apertures[clear_apid_size] = {
'type': 'C',
'size': clear_apid_size,
'geometry': []
}
holes_apertures[clear_apid_size]['geometry'].append(deepcopy(geo_elem))
@@ -498,8 +498,8 @@ class ToolPunchGerber(AppTool):
new_obj.apertures = deepcopy(new_apertures)
new_obj.solid_geometry = deepcopy(punched_solid_geometry)
new_obj.source_file = self.app.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
new_obj.source_file = app_obj.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
self.app.app_obj.new_object('gerber', outname, init_func)
@@ -605,14 +605,14 @@ class ToolPunchGerber(AppTool):
# since there may be drills that do not drill into a pad we test only for drills in a pad
if geo.within(elem['solid']):
geo_elem = {}
geo_elem['clear'] = geo.centroid
geo_elem = {'clear': geo.centroid}
if clear_apid_size not in holes_apertures:
holes_apertures[clear_apid_size] = {}
holes_apertures[clear_apid_size]['type'] = 'C'
holes_apertures[clear_apid_size]['size'] = clear_apid_size
holes_apertures[clear_apid_size]['geometry'] = []
holes_apertures[clear_apid_size] = {
'type': 'C',
'size': clear_apid_size,
'geometry': []
}
holes_apertures[clear_apid_size]['geometry'].append(deepcopy(geo_elem))
@@ -631,8 +631,8 @@ class ToolPunchGerber(AppTool):
new_obj.apertures = deepcopy(new_apertures)
new_obj.solid_geometry = deepcopy(punched_solid_geometry)
new_obj.source_file = self.app.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
new_obj.source_file = app_obj.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
self.app.app_obj.new_object('gerber', outname, init_func)
@@ -754,14 +754,14 @@ class ToolPunchGerber(AppTool):
# since there may be drills that do not drill into a pad we test only for geos in a pad
if geo.within(elem['solid']):
geo_elem = {}
geo_elem['clear'] = geo.centroid
geo_elem = {'clear': geo.centroid}
if clear_apid_size not in holes_apertures:
holes_apertures[clear_apid_size] = {}
holes_apertures[clear_apid_size]['type'] = 'C'
holes_apertures[clear_apid_size]['size'] = clear_apid_size
holes_apertures[clear_apid_size]['geometry'] = []
holes_apertures[clear_apid_size] = {
'type': 'C',
'size': clear_apid_size,
'geometry': []
}
holes_apertures[clear_apid_size]['geometry'].append(deepcopy(geo_elem))
@@ -780,8 +780,8 @@ class ToolPunchGerber(AppTool):
new_obj.apertures = deepcopy(new_apertures)
new_obj.solid_geometry = deepcopy(punched_solid_geometry)
new_obj.source_file = self.app.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
new_obj.source_file = app_obj.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
self.app.app_obj.new_object('gerber', outname, init_func)
@@ -898,14 +898,14 @@ class ToolPunchGerber(AppTool):
# since there may be drills that do not drill into a pad we test only for geos in a pad
if geo.within(elem['solid']):
geo_elem = {}
geo_elem['clear'] = geo.centroid
geo_elem = {'clear': geo.centroid}
if clear_apid_size not in holes_apertures:
holes_apertures[clear_apid_size] = {}
holes_apertures[clear_apid_size]['type'] = 'C'
holes_apertures[clear_apid_size]['size'] = clear_apid_size
holes_apertures[clear_apid_size]['geometry'] = []
holes_apertures[clear_apid_size] = {
'type': 'C',
'size': clear_apid_size,
'geometry': []
}
holes_apertures[clear_apid_size]['geometry'].append(deepcopy(geo_elem))
@@ -924,8 +924,8 @@ class ToolPunchGerber(AppTool):
new_obj.apertures = deepcopy(new_apertures)
new_obj.solid_geometry = deepcopy(punched_solid_geometry)
new_obj.source_file = self.app.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
new_obj.source_file = app_obj.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=new_obj, use_thread=False)
self.app.app_obj.new_object('gerber', outname, init_func)

View File

@@ -270,9 +270,11 @@ class QRCode(AppTool):
# don't know if the condition is required since I already made sure above that the new_apid is a new one
if new_apid not in self.grb_object.apertures:
self.grb_object.apertures[new_apid] = {}
self.grb_object.apertures[new_apid]['geometry'] = []
self.grb_object.apertures[new_apid]['type'] = 'R'
self.grb_object.apertures[new_apid] = {
'type': 'R',
'geometry': []
}
# TODO: HACK
# I've artificially added 1% to the height and width because otherwise after loading the
# exported file, it will not be correctly reconstructed (it will be made from multiple shapes instead of
@@ -282,15 +284,15 @@ class QRCode(AppTool):
self.grb_object.apertures[new_apid]['size'] = deepcopy(math.sqrt(box_size ** 2 + box_size ** 2))
if '0' not in self.grb_object.apertures:
self.grb_object.apertures['0'] = {}
self.grb_object.apertures['0']['geometry'] = []
self.grb_object.apertures['0']['type'] = 'REG'
self.grb_object.apertures['0']['size'] = 0.0
self.grb_object.apertures['0'] = {
'type': 'REG',
'size': 0.0,
'geometry': []
}
# in case that the QRCode geometry is dropped onto a copper region (found in the '0' aperture)
# make sure that I place a cutout there
zero_elem = {}
zero_elem['clear'] = offset_mask_geo
zero_elem = {'clear': offset_mask_geo}
self.grb_object.apertures['0']['geometry'].append(deepcopy(zero_elem))
try:
@@ -304,13 +306,13 @@ class QRCode(AppTool):
try:
for geo in self.qrcode_geometry:
geo_elem = {}
geo_elem['solid'] = translate(geo, xoff=pos[0], yoff=pos[1])
geo_elem['follow'] = translate(geo.centroid, xoff=pos[0], yoff=pos[1])
geo_elem = {
'solid': translate(geo, xoff=pos[0], yoff=pos[1]),
'follow': translate(geo.centroid, xoff=pos[0], yoff=pos[1])
}
self.grb_object.apertures[new_apid]['geometry'].append(deepcopy(geo_elem))
except TypeError:
geo_elem = {}
geo_elem['solid'] = self.qrcode_geometry
geo_elem = {'solid': self.qrcode_geometry}
self.grb_object.apertures[new_apid]['geometry'].append(deepcopy(geo_elem))
# update the source file with the new geometry:

View File

@@ -631,16 +631,18 @@ class RulesCheck(AppTool):
copper_list = []
copper_name_1 = self.ui.copper_t_object.currentText()
if copper_name_1 != '' and self.ui.copper_t_cb.get_value():
elem_dict = {}
elem_dict['name'] = deepcopy(copper_name_1)
elem_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_name_1).apertures)
elem_dict = {
'name': deepcopy(copper_name_1),
'apertures': deepcopy(app_obj.collection.get_by_name(copper_name_1).apertures)
}
copper_list.append(elem_dict)
copper_name_2 = self.ui.copper_b_object.currentText()
if copper_name_2 != '' and self.ui.copper_b_cb.get_value():
elem_dict = {}
elem_dict['name'] = deepcopy(copper_name_2)
elem_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_name_2).apertures)
elem_dict = {
'name': deepcopy(copper_name_2),
'apertures': deepcopy(app_obj.collection.get_by_name(copper_name_2).apertures)
}
copper_list.append(elem_dict)
trace_size = float(self.ui.trace_size_entry.get_value())
@@ -664,7 +666,7 @@ class RulesCheck(AppTool):
if copper_t_obj != '':
copper_t_dict['name'] = deepcopy(copper_t_obj)
copper_t_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_t_obj).apertures)
copper_t_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(copper_t_obj).apertures)
self.results.append(self.pool.apply_async(self.check_inside_gerber_clearance,
args=(copper_t_dict,
@@ -675,7 +677,7 @@ class RulesCheck(AppTool):
copper_b_dict = {}
if copper_b_obj != '':
copper_b_dict['name'] = deepcopy(copper_b_obj)
copper_b_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_b_obj).apertures)
copper_b_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(copper_b_obj).apertures)
self.results.append(self.pool.apply_async(self.check_inside_gerber_clearance,
args=(copper_b_dict,
@@ -683,7 +685,7 @@ class RulesCheck(AppTool):
_("BOTTOM -> Copper to Copper clearance"))))
if self.ui.copper_t_cb.get_value() is False and self.ui.copper_b_cb.get_value() is False:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Copper to Copper clearance"),
_("At least one Gerber object has to be selected for this rule but none is selected.")))
return
@@ -697,29 +699,29 @@ class RulesCheck(AppTool):
copper_top = self.ui.copper_t_object.currentText()
if copper_top != '' and self.ui.copper_t_cb.get_value():
top_dict['name'] = deepcopy(copper_top)
top_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_top).apertures)
top_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(copper_top).apertures)
copper_bottom = self.ui.copper_b_object.currentText()
if copper_bottom != '' and self.ui.copper_b_cb.get_value():
bottom_dict['name'] = deepcopy(copper_bottom)
bottom_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_bottom).apertures)
bottom_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(copper_bottom).apertures)
copper_outline = self.ui.outline_object.currentText()
if copper_outline != '' and self.ui.out_cb.get_value():
outline_dict['name'] = deepcopy(copper_outline)
outline_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_outline).apertures)
outline_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(copper_outline).apertures)
try:
copper_outline_clearance = float(self.ui.clearance_copper2ol_entry.get_value())
except Exception as e:
log.debug("RulesCheck.execute.worker_job() --> %s" % str(e))
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Copper to Outline clearance"),
_("Value is not valid.")))
return
if not top_dict and not bottom_dict or not outline_dict:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Copper to Outline clearance"),
_("One of the copper Gerber objects or the Outline Gerber object is not valid.")))
return
@@ -732,7 +734,7 @@ class RulesCheck(AppTool):
if outline_dict:
objs.append(outline_dict)
else:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Copper to Outline clearance"),
_("Outline Gerber object presence is mandatory for this rule but it is not selected.")))
return
@@ -750,7 +752,7 @@ class RulesCheck(AppTool):
silk_silk_clearance = float(self.ui.clearance_silk2silk_entry.get_value())
except Exception as e:
log.debug("RulesCheck.execute.worker_job() --> %s" % str(e))
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Silk to Silk clearance"),
_("Value is not valid.")))
return
@@ -759,7 +761,7 @@ class RulesCheck(AppTool):
silk_obj = self.ui.ss_t_object.currentText()
if silk_obj != '':
silk_dict['name'] = deepcopy(silk_obj)
silk_dict['apertures'] = deepcopy(self.app.collection.get_by_name(silk_obj).apertures)
silk_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(silk_obj).apertures)
self.results.append(self.pool.apply_async(self.check_inside_gerber_clearance,
args=(silk_dict,
@@ -769,7 +771,7 @@ class RulesCheck(AppTool):
silk_obj = self.ui.ss_b_object.currentText()
if silk_obj != '':
silk_dict['name'] = deepcopy(silk_obj)
silk_dict['apertures'] = deepcopy(self.app.collection.get_by_name(silk_obj).apertures)
silk_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(silk_obj).apertures)
self.results.append(self.pool.apply_async(self.check_inside_gerber_clearance,
args=(silk_dict,
@@ -777,7 +779,7 @@ class RulesCheck(AppTool):
_("BOTTOM -> Silk to Silk clearance"))))
if self.ui.ss_t_cb.get_value() is False and self.ui.ss_b_cb.get_value() is False:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Silk to Silk clearance"),
_("At least one Gerber object has to be selected for this rule but none is selected.")))
return
@@ -797,38 +799,38 @@ class RulesCheck(AppTool):
silk_top = self.ui.ss_t_object.currentText()
if silk_top != '' and self.ui.ss_t_cb.get_value():
silk_t_dict['name'] = deepcopy(silk_top)
silk_t_dict['apertures'] = deepcopy(self.app.collection.get_by_name(silk_top).apertures)
silk_t_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(silk_top).apertures)
top_ss = True
silk_bottom = self.ui.ss_b_object.currentText()
if silk_bottom != '' and self.ui.ss_b_cb.get_value():
silk_b_dict['name'] = deepcopy(silk_bottom)
silk_b_dict['apertures'] = deepcopy(self.app.collection.get_by_name(silk_bottom).apertures)
silk_b_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(silk_bottom).apertures)
bottom_ss = True
sm_top = self.ui.sm_t_object.currentText()
if sm_top != '' and self.ui.sm_t_cb.get_value():
sm_t_dict['name'] = deepcopy(sm_top)
sm_t_dict['apertures'] = deepcopy(self.app.collection.get_by_name(sm_top).apertures)
sm_t_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(sm_top).apertures)
top_sm = True
sm_bottom = self.ui.sm_b_object.currentText()
if sm_bottom != '' and self.ui.sm_b_cb.get_value():
sm_b_dict['name'] = deepcopy(sm_bottom)
sm_b_dict['apertures'] = deepcopy(self.app.collection.get_by_name(sm_bottom).apertures)
sm_b_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(sm_bottom).apertures)
bottom_sm = True
try:
silk_sm_clearance = float(self.ui.clearance_silk2sm_entry.get_value())
except Exception as e:
log.debug("RulesCheck.execute.worker_job() --> %s" % str(e))
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Silk to Solder Mask Clearance"),
_("Value is not valid.")))
return
if (not silk_t_dict and not silk_b_dict) or (not sm_t_dict and not sm_b_dict):
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Silk to Solder Mask Clearance"),
_("One or more of the Gerber objects is not valid.")))
return
@@ -846,7 +848,7 @@ class RulesCheck(AppTool):
silk_sm_clearance,
_("BOTTOM -> Silk to Solder Mask Clearance"))))
else:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Silk to Solder Mask Clearance"),
_("Both Silk and Solder Mask Gerber objects has to be either both Top or both Bottom.")))
return
@@ -860,29 +862,29 @@ class RulesCheck(AppTool):
silk_top = self.ui.ss_t_object.currentText()
if silk_top != '' and self.ui.ss_t_cb.get_value():
top_dict['name'] = deepcopy(silk_top)
top_dict['apertures'] = deepcopy(self.app.collection.get_by_name(silk_top).apertures)
top_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(silk_top).apertures)
silk_bottom = self.ui.ss_b_object.currentText()
if silk_bottom != '' and self.ui.ss_b_cb.get_value():
bottom_dict['name'] = deepcopy(silk_bottom)
bottom_dict['apertures'] = deepcopy(self.app.collection.get_by_name(silk_bottom).apertures)
bottom_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(silk_bottom).apertures)
copper_outline = self.ui.outline_object.currentText()
if copper_outline != '' and self.ui.out_cb.get_value():
outline_dict['name'] = deepcopy(copper_outline)
outline_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_outline).apertures)
outline_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(copper_outline).apertures)
try:
copper_outline_clearance = float(self.ui.clearance_copper2ol_entry.get_value())
except Exception as e:
log.debug("RulesCheck.execute.worker_job() --> %s" % str(e))
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Silk to Outline Clearance"),
_("Value is not valid.")))
return
if not top_dict and not bottom_dict or not outline_dict:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Silk to Outline Clearance"),
_("One of the Silk Gerber objects or the Outline Gerber object is not valid.")))
return
@@ -896,7 +898,7 @@ class RulesCheck(AppTool):
if outline_dict:
objs.append(outline_dict)
else:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Silk to Outline Clearance"),
_("Outline Gerber object presence is mandatory for this rule but it is not selected.")))
return
@@ -914,7 +916,7 @@ class RulesCheck(AppTool):
sm_sm_clearance = float(self.ui.clearance_sm2sm_entry.get_value())
except Exception as e:
log.debug("RulesCheck.execute.worker_job() --> %s" % str(e))
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Minimum Solder Mask Sliver"),
_("Value is not valid.")))
return
@@ -923,7 +925,7 @@ class RulesCheck(AppTool):
solder_obj = self.ui.sm_t_object.currentText()
if solder_obj != '':
sm_dict['name'] = deepcopy(solder_obj)
sm_dict['apertures'] = deepcopy(self.app.collection.get_by_name(solder_obj).apertures)
sm_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(solder_obj).apertures)
self.results.append(self.pool.apply_async(self.check_inside_gerber_clearance,
args=(sm_dict,
@@ -933,7 +935,7 @@ class RulesCheck(AppTool):
solder_obj = self.ui.sm_b_object.currentText()
if solder_obj != '':
sm_dict['name'] = deepcopy(solder_obj)
sm_dict['apertures'] = deepcopy(self.app.collection.get_by_name(solder_obj).apertures)
sm_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(solder_obj).apertures)
self.results.append(self.pool.apply_async(self.check_inside_gerber_clearance,
args=(sm_dict,
@@ -941,7 +943,7 @@ class RulesCheck(AppTool):
_("BOTTOM -> Minimum Solder Mask Sliver"))))
if self.ui.sm_t_cb.get_value() is False and self.ui.sm_b_cb.get_value() is False:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Minimum Solder Mask Sliver"),
_("At least one Gerber object has to be selected for this rule but none is selected.")))
return
@@ -956,36 +958,36 @@ class RulesCheck(AppTool):
copper_top = self.ui.copper_t_object.currentText()
if copper_top != '' and self.ui.copper_t_cb.get_value():
top_dict['name'] = deepcopy(copper_top)
top_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_top).apertures)
top_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(copper_top).apertures)
copper_bottom = self.ui.copper_b_object.currentText()
if copper_bottom != '' and self.ui.copper_b_cb.get_value():
bottom_dict['name'] = deepcopy(copper_bottom)
bottom_dict['apertures'] = deepcopy(self.app.collection.get_by_name(copper_bottom).apertures)
bottom_dict['apertures'] = deepcopy(app_obj.collection.get_by_name(copper_bottom).apertures)
excellon_1 = self.ui.e1_object.currentText()
if excellon_1 != '' and self.ui.e1_cb.get_value():
exc_1_dict['name'] = deepcopy(excellon_1)
exc_1_dict['tools'] = deepcopy(
self.app.collection.get_by_name(excellon_1).tools)
app_obj.collection.get_by_name(excellon_1).tools)
excellon_2 = self.ui.e2_object.currentText()
if excellon_2 != '' and self.ui.e2_cb.get_value():
exc_2_dict['name'] = deepcopy(excellon_2)
exc_2_dict['tools'] = deepcopy(
self.app.collection.get_by_name(excellon_2).tools)
app_obj.collection.get_by_name(excellon_2).tools)
try:
ring_val = float(self.ui.ring_integrity_entry.get_value())
except Exception as e:
log.debug("RulesCheck.execute.worker_job() --> %s" % str(e))
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Minimum Annular Ring"),
_("Value is not valid.")))
return
if (not top_dict and not bottom_dict) or (not exc_1_dict and not exc_2_dict):
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Minimum Annular Ring"),
_("One of the Copper Gerber objects or the Excellon objects is not valid.")))
return
@@ -1001,7 +1003,7 @@ class RulesCheck(AppTool):
elif exc_2_dict:
objs.append(exc_2_dict)
else:
self.app.inform.emit('[ERROR_NOTCL] %s. %s' % (
app_obj.inform.emit('[ERROR_NOTCL] %s. %s' % (
_("Minimum Annular Ring"),
_("Excellon object presence is mandatory for this rule but none is selected.")))
return
@@ -1016,16 +1018,18 @@ class RulesCheck(AppTool):
exc_list = []
exc_name_1 = self.ui.e1_object.currentText()
if exc_name_1 != '' and self.ui.e1_cb.get_value():
elem_dict = {}
elem_dict['name'] = deepcopy(exc_name_1)
elem_dict['tools'] = deepcopy(self.app.collection.get_by_name(exc_name_1).tools)
elem_dict = {
'name': deepcopy(exc_name_1),
'tools': deepcopy(app_obj.collection.get_by_name(exc_name_1).tools)
}
exc_list.append(elem_dict)
exc_name_2 = self.ui.e2_object.currentText()
if exc_name_2 != '' and self.ui.e2_cb.get_value():
elem_dict = {}
elem_dict['name'] = deepcopy(exc_name_2)
elem_dict['tools'] = deepcopy(self.app.collection.get_by_name(exc_name_2).tools)
elem_dict = {
'name': deepcopy(exc_name_2),
'tools': deepcopy(app_obj.collection.get_by_name(exc_name_2).tools)
}
exc_list.append(elem_dict)
hole_clearance = float(self.ui.clearance_d2d_entry.get_value())
@@ -1036,16 +1040,18 @@ class RulesCheck(AppTool):
exc_list = []
exc_name_1 = self.ui.e1_object.currentText()
if exc_name_1 != '' and self.ui.e1_cb.get_value():
elem_dict = {}
elem_dict['name'] = deepcopy(exc_name_1)
elem_dict['tools'] = deepcopy(self.app.collection.get_by_name(exc_name_1).tools)
elem_dict = {
'name': deepcopy(exc_name_1),
'tools': deepcopy(app_obj.collection.get_by_name(exc_name_1).tools)
}
exc_list.append(elem_dict)
exc_name_2 = self.ui.e2_object.currentText()
if exc_name_2 != '' and self.ui.e2_cb.get_value():
elem_dict = {}
elem_dict['name'] = deepcopy(exc_name_2)
elem_dict['tools'] = deepcopy(self.app.collection.get_by_name(exc_name_2).tools)
elem_dict = {
'name': deepcopy(exc_name_2),
'tools': deepcopy(app_obj.collection.get_by_name(exc_name_2).tools)
}
exc_list.append(elem_dict)
drill_size = float(self.ui.drill_size_entry.get_value())
@@ -1056,7 +1062,7 @@ class RulesCheck(AppTool):
output.append(p.get())
self.tool_finished.emit(output)
self.app.proc_container.view.set_idle()
app_obj.proc_container.view.set_idle()
log.debug("RuleCheck() finished")

View File

@@ -195,9 +195,7 @@ class ToolSub(AppTool):
def worker_job(app_obj):
# SUBTRACTOR geometry (always the same)
sub_geometry = {}
sub_geometry['solid'] = []
sub_geometry['clear'] = []
sub_geometry = {'solid': [], 'clear': []}
# iterate over SUBTRACTOR geometry and load it in the sub_geometry dict
for s_apid in app_obj.sub_grb_obj.apertures:
for s_el in app_obj.sub_grb_obj.apertures[s_apid]['geometry']:
@@ -206,13 +204,13 @@ class ToolSub(AppTool):
if "clear" in s_el:
sub_geometry['clear'].append(s_el["clear"])
for apid in app_obj.target_grb_obj.apertures:
for ap_id in app_obj.target_grb_obj.apertures:
# TARGET geometry
target_geo = [geo for geo in app_obj.target_grb_obj.apertures[apid]['geometry']]
target_geo = [geo for geo in app_obj.target_grb_obj.apertures[ap_id]['geometry']]
# send the job to the multiprocessing JOB
app_obj.results.append(
app_obj.pool.apply_async(app_obj.aperture_intersection, args=(apid, target_geo, sub_geometry))
app_obj.pool.apply_async(app_obj.aperture_intersection, args=(ap_id, target_geo, sub_geometry))
)
output = []
@@ -348,8 +346,8 @@ class ToolSub(AppTool):
grb_obj.solid_geometry = deepcopy(poly_buff)
grb_obj.follow_geometry = deepcopy(follow_buff)
grb_obj.source_file = self.app.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=grb_obj, use_thread=False)
grb_obj.source_file = app_obj.f_handlers.export_gerber(obj_name=outname, filename=None,
local_use=grb_obj, use_thread=False)
with self.app.proc_container.new(_("Generating new object ...")):
ret = self.app.app_obj.new_object('gerber', outname, obj_init, autoselected=False)
@@ -542,7 +540,7 @@ class ToolSub(AppTool):
for tool in geo_obj.tools:
geo_obj.tools[tool]['solid_geometry'] = deepcopy(self.new_solid_geometry)
except Exception as e:
log.debug("ToolSub.new_geo_object() --> %s" % str(e))
app_obj.log.debug("ToolSub.new_geo_object() --> %s" % str(e))
geo_obj.multigeo = False
with self.app.proc_container.new(_("Generating new object ...")):