diff --git a/README.md b/README.md
index 0d1e8443..0e1e5f14 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ CAD program, and create G-Code for Isolation routing.
12.10.2019
- fixed the Gerber Parser convert units unnecessary usage. The only units conversion should be done when creating the new object, after the parsing
-
+- more fixes in Rules Check Tool
11.10.2019
diff --git a/flatcamTools/ToolRulesCheck.py b/flatcamTools/ToolRulesCheck.py
index 1a925f9d..dc65d0fc 100644
--- a/flatcamTools/ToolRulesCheck.py
+++ b/flatcamTools/ToolRulesCheck.py
@@ -564,6 +564,8 @@ class RulesCheck(FlatCAMTool):
@staticmethod
def check_inside_gerber_clearance(gerber_obj, size, rule):
+ log.debug("RulesCheck.check_inside_gerber_clearance()")
+
rule_title = rule
violations = list()
@@ -639,6 +641,7 @@ class RulesCheck(FlatCAMTool):
@staticmethod
def check_gerber_clearance(gerber_list, size, rule):
+ log.debug("RulesCheck.check_gerber_clearance()")
rule_title = rule
violations = list()
@@ -694,11 +697,13 @@ class RulesCheck(FlatCAMTool):
if isinstance(total_geo_grb_1, Polygon):
len_1 = 1
+ total_geo_grb_1 = [total_geo_grb_1]
else:
len_1 = len(total_geo_grb_1)
if isinstance(total_geo_grb_3, Polygon):
len_3 = 1
+ total_geo_grb_3 = [total_geo_grb_3]
else:
len_3 = len(total_geo_grb_3)
@@ -743,6 +748,8 @@ class RulesCheck(FlatCAMTool):
@staticmethod
def check_holes_size(elements, size):
+ log.debug("RulesCheck.check_holes_size()")
+
rule = _("Hole Size")
violations = list()
@@ -757,7 +764,7 @@ class RulesCheck(FlatCAMTool):
name = elem['name']
for tool in elem['tools']:
- tool_dia = float(elem['tools'][tool]['C'])
+ tool_dia = float('%.*f' % (4, float(elem['tools'][tool]['C'])))
if tool_dia < float(size):
dia_list.append(tool_dia)
obj_violations['name'] = name
@@ -768,6 +775,7 @@ class RulesCheck(FlatCAMTool):
@staticmethod
def check_holes_clearance(elements, size):
+ log.debug("RulesCheck.check_holes_clearance()")
rule = _("Hole to Hole Clearance")
violations = list()
@@ -822,6 +830,8 @@ class RulesCheck(FlatCAMTool):
@staticmethod
def check_traces_size(elements, size):
+ log.debug("RulesCheck.check_traces_size()")
+
rule = _("Trace Size")
violations = list()
@@ -934,11 +944,13 @@ class RulesCheck(FlatCAMTool):
if isinstance(total_geo_grb, Polygon):
len_1 = 1
+ total_geo_grb = [total_geo_grb]
else:
len_1 = len(total_geo_grb)
if isinstance(total_geo_exc, Polygon):
len_2 = 1
+ total_geo_exc = [total_geo_exc]
else:
len_2 = len(total_geo_exc)
@@ -946,21 +958,32 @@ class RulesCheck(FlatCAMTool):
log.debug("RulesCheck.check_gerber_annular_ring(). Iterations: %s" % str(iterations))
min_dict = dict()
+ dist = None
for geo in total_geo_grb:
for s_geo in total_geo_exc:
- # minimize the number of distances by not taking into considerations those that are too small
- dist = geo.exterior.distance(s_geo)
- if float(dist) < float(size):
- loc_1, loc_2 = nearest_points(geo.exterior, s_geo)
+ try:
+ # minimize the number of distances by not taking into considerations those that are too small
+ dist = abs(geo.exterior.distance(s_geo))
+ except Exception as e:
+ log.debug("RulesCheck.check_gerber_annular_ring() --> %s" % str(e))
- dx = loc_1.x - loc_2.x
- dy = loc_1.y - loc_2.y
- loc = min(loc_1.x, loc_2.x) + (abs(dx) / 2), min(loc_1.y, loc_2.y) + (abs(dy) / 2)
+ if dist > 0:
+ if float(dist) < float(size):
+ loc_1, loc_2 = nearest_points(geo.exterior, s_geo)
+ dx = loc_1.x - loc_2.x
+ dy = loc_1.y - loc_2.y
+ loc = min(loc_1.x, loc_2.x) + (abs(dx) / 2), min(loc_1.y, loc_2.y) + (abs(dy) / 2)
+
+ if dist in min_dict:
+ min_dict[dist].append(loc)
+ else:
+ min_dict[dist] = [loc]
+ else:
if dist in min_dict:
- min_dict[dist].append(loc)
+ min_dict[dist].append(s_geo.representative_point())
else:
- min_dict[dist] = [loc]
+ min_dict[dist] = [s_geo.representative_point()]
points_list = list()
for dist in min_dict.keys():
@@ -968,19 +991,32 @@ class RulesCheck(FlatCAMTool):
points_list.append(location)
name_list = list()
- if gerber_obj:
- name_list.append(gerber_obj['name'])
- if gerber_extra_obj:
- name_list.append(gerber_extra_obj['name'])
- if exc_obj:
- name_list.append(exc_obj['name'])
- if exc_extra_obj:
- name_list.append(exc_extra_obj['name'])
+ try:
+ if gerber_obj:
+ name_list.append(gerber_obj['name'])
+ except KeyError:
+ pass
+ try:
+ if gerber_extra_obj:
+ name_list.append(gerber_extra_obj['name'])
+ except KeyError:
+ pass
+
+ try:
+ if exc_obj:
+ name_list.append(exc_obj['name'])
+ except KeyError:
+ pass
+
+ try:
+ if exc_extra_obj:
+ name_list.append(exc_extra_obj['name'])
+ except KeyError:
+ pass
obj_violations['name'] = name_list
obj_violations['points'] = points_list
violations.append(deepcopy(obj_violations))
-
return rule_title, violations
def execute(self):
@@ -1438,22 +1474,46 @@ class RulesCheck(FlatCAMTool):
txt += 'File name: %s
' % str(el[1][0]['name'])
point_txt = ''
- if el[1][0]['points']:
- txt += '{title}: {status}.
'.format(title=_("STATUS"),
- color='red',
- status=_("FAILED"))
- if 'Failed' in el[1][0]['points'][0]:
- point_txt = el[1][0]['points'][0]
+ try:
+ if el[1][0]['points']:
+ txt += '{title}: {status}.
'.format(title=_("STATUS"),
+ color='red',
+ status=_("FAILED"))
+ if 'Failed' in el[1][0]['points'][0]:
+ point_txt = el[1][0]['points'][0]
+ else:
+ for pt in el[1][0]['points']:
+ point_txt += '(%.*f, %.*f)' % (self.decimals, float(pt[0]), self.decimals, float(pt[1]))
+ point_txt += ', '
+ txt += 'Violations: %s
' % str(point_txt)
else:
- for pt in el[1][0]['points']:
- point_txt += '(%.*f, %.*f)' % (self.decimals, float(pt[0]), self.decimals, float(pt[1]))
- point_txt += ', '
- txt += 'Violations: %s
' % str(point_txt)
- else:
- txt += '{title}: {status}.
'.format(title=_("STATUS"),
- color='green',
- status=_("PASSED"))
- txt += '%s
' % _("Violations: There are no violations for the current rule.")
+ txt += '{title}: {status}.
'.format(title=_("STATUS"),
+ color='green',
+ status=_("PASSED"))
+ txt += '%s
' % _("Violations: There are no violations for the current rule.")
+ except KeyError:
+ pass
+
+ try:
+ if el[1][0]['dia']:
+ txt += '{title}: {status}.
'.format(title=_("STATUS"),
+ color='red',
+ status=_("FAILED"))
+ if 'Failed' in el[1][0]['dia']:
+ point_txt = el[1][0]['dia']
+ else:
+ for pt in el[1][0]['dia']:
+ point_txt += '%.*f' % (self.decimals, float(pt))
+ point_txt += ', '
+ txt += 'Violations: %s
' % str(point_txt)
+ else:
+ txt += '{title}: {status}.
'.format(title=_("STATUS"),
+ color='green',
+ status=_("PASSED"))
+ txt += '%s
' % _("Violations: There are no violations for the current rule.")
+ except KeyError:
+ pass
+
txt += '
'
new_obj.source_file = txt
new_obj.read_only = True