From fc9f7510d4da688c8c701bb9a7f3d6694960f0a0 Mon Sep 17 00:00:00 2001 From: Sabin Iacob Date: Sat, 29 Apr 2017 11:06:41 +0300 Subject: [PATCH] [path] Sort helix drill jobs to improve efficiency --- src/Mod/Path/PathScripts/PathHelix.py | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/Mod/Path/PathScripts/PathHelix.py b/src/Mod/Path/PathScripts/PathHelix.py index ccd9c2363d..117aee48db 100644 --- a/src/Mod/Path/PathScripts/PathHelix.py +++ b/src/Mod/Path/PathScripts/PathHelix.py @@ -297,6 +297,35 @@ class ObjectPathHelix(object): def __setstate__(self, state): return None + def sort_jobs(self, jobs): + """ sort holes by the nearest neighbor method """ + from Queue import PriorityQueue + + def sqdist(a, b): + """ square Euclidean distance """ + return (a['xc'] - b['xc']) ** 2 + (a['yc'] - b['yc']) ** 2 + + def find_closest(job_list, job, dist): + q = PriorityQueue() + + for j in job_list: + q.put((dist(j, job) + job['xc'], j)) + + prio, result = q.get() + return result + + out = [] + zero = {'xc': 0, 'yc': 0} + + out.append(find_closest(jobs, zero, sqdist)) + + while jobs: + closest = find_closest(jobs, out[-1], sqdist) + out.append(closest) + jobs.remove(closest) + + return out + def execute(self, obj): from Part import Circle, Cylinder, Plane from math import sqrt @@ -404,6 +433,8 @@ class ObjectPathHelix(object): drill_jobs.extend(jobs) + drill_jobs = self.sort_jobs(drill_jobs) + for job in drill_jobs: output += helix_cut((job["xc"], job["yc"]), job["r_out"], job["r_in"], obj.DeltaR.Value, job["zmax"], job["zmin"], obj.StepDown.Value,