diff --git a/src/Mod/Path/PathScripts/PathDressupZCorrect.py b/src/Mod/Path/PathScripts/PathDressupZCorrect.py index 2be8337f4b..65388caa21 100644 --- a/src/Mod/Path/PathScripts/PathDressupZCorrect.py +++ b/src/Mod/Path/PathScripts/PathDressupZCorrect.py @@ -29,6 +29,7 @@ import FreeCAD import FreeCADGui import Part import Path +import PathScripts.PathGeom as PathGeom import PathScripts.PathLog as PathLog import PathScripts.PathUtils as PathUtils #from bisect import bisect_left @@ -40,7 +41,7 @@ from PySide import QtCore, QtGui LOG_MODULE = PathLog.thisModule() -if False: +if True: PathLog.setLevel(PathLog.Level.DEBUG, LOG_MODULE) PathLog.setLevel(PathLog.Level.DEBUG, LOG_MODULE) else: @@ -59,11 +60,14 @@ class ObjectDressup: def __init__(self, obj): obj.addProperty("App::PropertyLink", "Base", "Path", QtCore.QT_TRANSLATE_NOOP("Path_DressupAxisMap", "The base path to modify")) - obj.addProperty("App::PropertyFile", "probefile", "Path", QtCore.QT_TRANSLATE_NOOP("Path_DressupZCorrect", "The point file from the surface probing.")) + obj.addProperty("App::PropertyFile", "probefile", "ProbeData", QtCore.QT_TRANSLATE_NOOP("Path_DressupZCorrect", "The point file from the surface probing.")) obj.Proxy = self obj.addProperty("Part::PropertyPartShape", "interpSurface", "Path") obj.setEditorMode('interpSurface', 2) # hide - + obj.addProperty("App::PropertyDistance", "ArcInterpolate", "Interpolate", QtCore.QT_TRANSLATE_NOOP("Path_DressupZCorrect", "Deflection distance for arc interpolation")) + obj.addProperty("App::PropertyDistance", "SegInterpolate", "Interpolate", QtCore.QT_TRANSLATE_NOOP("Path_DressupZCorrectp", "break segments into smaller segments of this length.")) + obj.ArcInterpolate = 0.1 + obj.SegInterpolate = 1.0 def __getstate__(self): return None @@ -76,7 +80,6 @@ class ObjectDressup: def _bilinearInterpolate(self, surface, x, y): - print ('xval:{}, yval:{}'.format(x, y)) p1 = FreeCAD.Vector(x, y, 100.0) p2 = FreeCAD.Vector(x, y, -100.0) @@ -84,7 +87,6 @@ class ObjectDressup: points, curves = vertical_line.intersectCS(surface) return points[0].Z - def _loadFile(self, obj, filename): if filename == "": return @@ -100,9 +102,12 @@ class ObjectDressup: zval = round(float(w[2]), 2) pointlist.append([xval, yval,zval]) + PathLog.debug(pointlist) cols = list(zip(*pointlist)) + PathLog.debug("cols: {}".format(cols)) yindex = list(sorted(set(cols[1]))) + PathLog.debug("yindex: {}".format(yindex)) array = [] for y in yindex: @@ -121,6 +126,10 @@ class ObjectDressup: def execute(self, obj): + + sampleD = obj.SegInterpolate.Value + curveD = obj.ArcInterpolate.Value + if obj.interpSurface.isNull(): #No valid probe data. return unchanged path obj.Path = obj.Base.Path return @@ -131,28 +140,36 @@ class ObjectDressup: if obj.Base.isDerivedFrom("Path::Feature"): if obj.Base.Path: if obj.Base.Path.Commands: - pp = obj.Base.Path.Commands - # process the path + pathlist = obj.Base.Path.Commands - pathlist = pp newcommandlist = [] currLocation = {'X':0,'Y':0,'Z':0, 'F': 0} for c in pathlist: #obj.Base.Path.Commands: + PathLog.debug(c) + PathLog.debug(" curLoc:{}".format(currLocation)) newparams = dict(c.Parameters) - zval = newparams.pop("Z", currLocation['Z']) - currLocation.update(newparams) + zval = newparams.get("Z", currLocation['Z']) if c.Name in movecommands: - remapvar = currLocation['Z'] - offset = self._bilinearInterpolate(surface, currLocation['X'], currLocation['Y']) - newparams["Z"] = remapvar + offset - newcommand = Path.Command(c.Name, newparams) - newcommandlist.append(newcommand) - currLocation.update(newparams) - currLocation['Z'] = zval - else: - newcommandlist.append(c) + curVec = FreeCAD.Vector(currLocation['X'], currLocation['Y'], currLocation['Z']) + arcwire = PathGeom.edgeForCmd(c, curVec) + if arcwire is None: + continue + if c.Name in arccommands: + pointlist = arcwire.discretize(Deflection=curveD) + else: + pointlist = arcwire.discretize(Number=int(arcwire.Length / sampleD)) + for point in pointlist: + offset = self._bilinearInterpolate(surface, point.x, point.y) + newcommand = Path.Command("G1", {'X':point.x, 'Y':point.y, 'Z':point.z + offset}) + newcommandlist.append(newcommand) + currLocation.update(newcommand.Parameters) + currLocation['Z'] = zval + else: + # Non Feed Command + newcommandlist.append(c) + currLocation.update(c.Parameters) path = Path.Path(newcommandlist) obj.Path = path @@ -162,7 +179,7 @@ class TaskPanel: self.obj = obj self.form = FreeCADGui.PySideUic.loadUi(":/panels/ZCorrectEdit.ui") FreeCAD.ActiveDocument.openTransaction(translate("Path_DressupZCorrect", "Edit Z Correction Dress-up")) - self.interpshape = FreeCAD.ActiveDocument.addObject("Part::Feature", "InterpolationSurface") + self.interpshape = FreeCAD.ActiveDocument.addObject("Part::Feature", "InterpolationSurface") self.interpshape.Shape = obj.interpSurface self.interpshape.ViewObject.Transparency = 60 self.interpshape.ViewObject.ShapeColor = (1.00000,1.00000,0.01961) diff --git a/src/Mod/Path/PathScripts/PathGeom.py b/src/Mod/Path/PathScripts/PathGeom.py index 2fbaae4a40..fba8d1ddb1 100644 --- a/src/Mod/Path/PathScripts/PathGeom.py +++ b/src/Mod/Path/PathScripts/PathGeom.py @@ -313,6 +313,9 @@ def edgeForCmd(cmd, startPoint): """edgeForCmd(cmd, startPoint). Returns an Edge representing the given command, assuming a given startPoint.""" + PathLog.debug("cmd: {}".format(cmd)) + PathLog.debug("startpoint {}".format(startPoint)) + endPoint = commandEndPoint(cmd, startPoint) if (cmd.Name in CmdMoveStraight) or (cmd.Name in CmdMoveRapid): if pointsCoincide(startPoint, endPoint): @@ -343,6 +346,10 @@ def edgeForCmd(cmd, startPoint): if isRoughly(startPoint.z, endPoint.z): midPoint = center + Vector(math.cos(angle), math.sin(angle), 0) * R PathLog.debug("arc: (%.2f, %.2f) -> (%.2f, %.2f) -> (%.2f, %.2f)" % (startPoint.x, startPoint.y, midPoint.x, midPoint.y, endPoint.x, endPoint.y)) + PathLog.debug("StartPoint:{}".format(startPoint)) + PathLog.debug("MidPoint:{}".format(midPoint)) + PathLog.debug("EndPoint:{}".format(endPoint)) + return Part.Edge(Part.Arc(startPoint, midPoint, endPoint)) # It's a Helix diff --git a/src/Mod/Path/PathScripts/PathGuiInit.py b/src/Mod/Path/PathScripts/PathGuiInit.py index 57f302fc3a..29272c0382 100644 --- a/src/Mod/Path/PathScripts/PathGuiInit.py +++ b/src/Mod/Path/PathScripts/PathGuiInit.py @@ -51,6 +51,7 @@ def Startup(): from PathScripts import PathDressupPathBoundaryGui from PathScripts import PathDressupTagGui from PathScripts import PathDressupLeadInOut + from PathScripts import PathDressupZCorrect from PathScripts import PathDrillingGui from PathScripts import PathEngraveGui from PathScripts import PathFixture @@ -61,6 +62,7 @@ def Startup(): from PathScripts import PathPocketGui from PathScripts import PathPocketShapeGui from PathScripts import PathPost + from PathScripts import PathProbeGui from PathScripts import PathProfileContourGui from PathScripts import PathProfileEdgesGui from PathScripts import PathProfileFacesGui