From 5f7faa25af35509cf42b45e98983b7d0747771bb Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Mon, 4 Dec 2017 01:39:25 -0800 Subject: [PATCH] Fixed hole detection for bottom faces. --- src/Mod/Path/PathScripts/PathCircularHoleBase.py | 12 +++++++++--- src/Mod/Path/PathScripts/PathUtils.py | 7 ++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathCircularHoleBase.py b/src/Mod/Path/PathScripts/PathCircularHoleBase.py index f440c94208..47628fcf30 100644 --- a/src/Mod/Path/PathScripts/PathCircularHoleBase.py +++ b/src/Mod/Path/PathScripts/PathCircularHoleBase.py @@ -232,9 +232,15 @@ class ObjectOp(PathOp.ObjectOp): f = shape.getElement(candidateFaceName) if PathUtils.isDrillable(shape, f, tooldiameter): PathLog.debug('face candidate: {} is drillable '.format(f)) - x = f.Surface.Center.x - y = f.Surface.Center.y - diameter = f.BoundBox.XLength + if hasattr(f.Surface, 'Center'): + x = f.Surface.Center.x + y = f.Surface.Center.y + diameter = f.BoundBox.XLength + else: + center = f.Edges[0].Curve.Center + x = center.x + y = center.y + diameter = f.Edges[0].Curve.Radius * 2 holelist.append({'featureName': candidateFaceName, 'feature': f, 'x': x, 'y': y, 'd': diameter, 'enabled': True}) features.append((baseobject, candidateFaceName)) PathLog.debug("Found hole feature %s.%s" % (baseobject.Label, candidateFaceName)) diff --git a/src/Mod/Path/PathScripts/PathUtils.py b/src/Mod/Path/PathScripts/PathUtils.py index 75edaafab9..abd847493c 100644 --- a/src/Mod/Path/PathScripts/PathUtils.py +++ b/src/Mod/Path/PathScripts/PathUtils.py @@ -166,7 +166,12 @@ def isDrillable(obj, candidate, tooldiameter=None, includePartials=False): drillable = True elif type(face.Surface) == Part.Plane and PathGeom.pointsCoincide(face.Surface.Axis, FreeCAD.Vector(0,0,1)): if len(face.Edges) == 1 and type(face.Edges[0].Curve) == Part.Circle: - return True + center = face.Edges[0].Curve.Center + if obj.isInside(center, 1e-6, False): + if tooldiameter is not None: + drillable = face.Edges[0].Curve.Radius >= tooldiameter/2 + else: + drillable = True else: for edge in candidate.Edges: if isinstance(edge.Curve, Part.Circle) and (includePartials or edge.isClosed()):