diff --git a/src/Mod/Path/Gui/Resources/panels/PageOpPocketExtEdit.ui b/src/Mod/Path/Gui/Resources/panels/PageOpPocketExtEdit.ui
index 8af3de3fdf..5b0ff175d5 100644
--- a/src/Mod/Path/Gui/Resources/panels/PageOpPocketExtEdit.ui
+++ b/src/Mod/Path/Gui/Resources/panels/PageOpPocketExtEdit.ui
@@ -14,22 +14,6 @@
Form
- -
-
-
- QFrame::Panel
-
-
- QFrame::Raised
-
-
- Requires "Use Outline" to be enabled!
-
-
- Qt::AlignCenter
-
-
-
-
diff --git a/src/Mod/Path/PathScripts/PathPocketShape.py b/src/Mod/Path/PathScripts/PathPocketShape.py
index 50a69b4ba3..efc58115a3 100644
--- a/src/Mod/Path/PathScripts/PathPocketShape.py
+++ b/src/Mod/Path/PathScripts/PathPocketShape.py
@@ -31,6 +31,7 @@ import PathScripts.PathPocketBase as PathPocketBase
import PathScripts.PathUtil as PathUtil
import PathScripts.PathUtils as PathUtils
import TechDraw
+import math
import sys
from PySide import QtCore
@@ -50,6 +51,56 @@ else:
def translate(context, text, disambig=None):
return QtCore.QCoreApplication.translate(context, text, disambig)
+def endPoints(edgeOrWire):
+ if Part.Wire == type(edgeOrWire):
+ edges = edgeOrWire.Edges
+ pts = [e.valueAt(e.FirstParameter) for e in edgeOrWire.Edges]
+ pts.extend([e.valueAt(e.LastParameter) for e in edgeOrWire.Edges])
+ unique = []
+ for p in pts:
+ cnt = len([p2 for p2 in pts if PathGeom.pointsCoincide(p, p2)])
+ if 1 == cnt:
+ unique.append(p)
+ return unique
+ return [e.valueAt(edgeOrWire.FirstParameter), e.valueAt(edgeOrWire.LastParameter)]
+
+def includesPoint(p, pts):
+ for pt in pts:
+ if PathGeom.pointsCoincide(p, pt):
+ return True
+ return False
+
+def extendWire(wire, length, direction):
+ if type(direction) == FreeCAD.Vector:
+ direction = PathGeom.getAngle(direction)
+ off2D = wire.makeOffset2D(length)
+ endPts = endPoints(wire)
+ edges = [e for e in off2D.Edges if Part.Circle != type(e.Curve) or not includesPoint(e.Curve.Center, endPts)]
+ wires = [Part.Wire(e) for e in Part.sortEdges(edges)]
+ direct = None
+ for w in wires:
+ a = 0
+ for ep in endPoints(w):
+ angles = [math.fabs(PathGeom.getAngle(ep - p)) for p in endPts]
+ a = a + sum(angles) / len(angles)
+ a = math.fabs(a / len(ep) - direction)
+ if direct is None or direct[0] > a:
+ direct = (a, w)
+ offset = direct[1]
+ ePts = endPoints(offset)
+ l0 = (ePts[0] - endPts[0]).Length
+ l1 = (ePts[1] - endPts[0]).Length
+ edges = wire.Edges
+ if l0 < l1:
+ edges.append(Part.Edge(Part.LineSegment(endPts[0], ePts[0])))
+ edges.extend(offset.Edges)
+ edges.append(Part.Edge(Part.LineSegment(endPts[1], ePts[1])))
+ else:
+ edges.append(Part.Edge(Part.LineSegment(endPts[1], ePts[0])))
+ edges.extend(offset.Edges)
+ edges.append(Part.Edge(Part.LineSegment(endPts[0], ePts[1])))
+ return Part.Wire(edges)
+
class Extension(object):
DirectionNormal = 0
DirectionX = 1
@@ -62,15 +113,17 @@ class Extension(object):
self.direction = direction
def extendEdge(self, e0, direction):
- e2 = e0.copy()
- off = self.length.Value * direction
- e2.translate(off)
- e2 = PathGeom.flipEdge(e2)
- e1 = Part.Edge(Part.LineSegment(e0.valueAt(e0.LastParameter), e2.valueAt(e2.FirstParameter)))
- e3 = Part.Edge(Part.LineSegment(e2.valueAt(e2.LastParameter), e0.valueAt(e0.FirstParameter)))
- wire = Part.Wire([e0, e1, e2, e3])
- self.wire = wire
- return wire
+ if Part.Line == type(e0.Curve) or Part.LineSegment == type(e0.Curve):
+ e2 = e0.copy()
+ off = self.length.Value * direction
+ e2.translate(off)
+ e2 = PathGeom.flipEdge(e2)
+ e1 = Part.Edge(Part.LineSegment(e0.valueAt(e0.LastParameter), e2.valueAt(e2.FirstParameter)))
+ e3 = Part.Edge(Part.LineSegment(e2.valueAt(e2.LastParameter), e0.valueAt(e0.FirstParameter)))
+ wire = Part.Wire([e0, e1, e2, e3])
+ self.wire = wire
+ return wire
+ return extendWire(Part.Wire([e0]), self.length.Value, direction)
def getWire(self):
if PathGeom.isRoughly(0, self.length.Value):
diff --git a/src/Mod/Path/PathScripts/PathPocketShapeGui.py b/src/Mod/Path/PathScripts/PathPocketShapeGui.py
index 7e99faf3e5..776c57d9e4 100644
--- a/src/Mod/Path/PathScripts/PathPocketShapeGui.py
+++ b/src/Mod/Path/PathScripts/PathPocketShapeGui.py
@@ -96,8 +96,6 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
def initPage(self, obj):
self.setTitle("Pocket Extensions")
- self.enabled = not obj.UseOutline
- self.enable(not self.enabled)
self.extensions = obj.Proxy.getExtensions(obj)
self.defaultLength = PathGui.QuantitySpinBox(self.form.defaultLength, obj, 'ExtensionLengthDefault')
@@ -112,16 +110,6 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
def cleanupPage(self, obj):
self.obj.ViewObject.RootNode.removeChild(self.switch)
- def enable(self, ena):
- if ena != self.enabled:
- self.enabled = ena
- if ena:
- self.form.info.hide()
- self.form.extensionEdit.setEnabled(True)
- else:
- self.form.info.show()
- self.form.extensionEdit.setEnabled(False)
-
def getForm(self):
return FreeCADGui.PySideUic.loadUi(":/panels/PageOpPocketExtEdit.ui")
@@ -257,11 +245,8 @@ class TaskPanelOpPage(PathPocketBaseGui.TaskPanelOpPage):
self.extensionsPanel = TaskPanelExtensionPage(obj, features)
return self.extensionsPanel
- def enableExtensions(self):
- self.extensionsPanel.enable(self.form.useOutline.isChecked())
-
def pageRegisterSignalHandlers(self):
- self.form.useOutline.clicked.connect(self.enableExtensions)
+ pass
Command = PathOpGui.SetupOperation('Pocket Shape',
PathPocketShape.Create,