def rectAreaByOutline(area, bit_diameter, debug=False): """ Required arguments: area (as (x=length, y=width), bit_diameter. Assumes that the bit is already in the origin corner at required depth of cut. This version just cuts progressively smaller rectangles. For fastest progress, orient the largest area dimension with the fastest machine axis. """ length, width = area if bit_diameter > length or bit_diameter > width: raise ValueError("Bit is too large to cut specified area") # magic number 0.5 is the pass-to-pass overlap... not sure that I'll enforce it min_overlap = 0.5 min_passes = min(math.ceil(length / bit_diameter), math.ceil(width / bit_diameter)) min_passes += min_passes % 2 x_overlap = max(min_overlap, (((min_passes * bit_diameter) - length) / (min_passes - 1))) y_overlap = max(min_overlap, (((min_passes * bit_diameter) - width) / (min_passes - 1))) x_step = bit_diameter - x_overlap y_step = bit_diameter - y_overlap file_text = G.set_INCR_mode() current_x = 0 current_y = 0 if debug: file_text += "; length: " + str(length) + "\n" file_text += "; width: " + str(width) + "\n" file_text += "; bit_diameter: " + str(bit_diameter) + "\n" file_text += "; min_passes: " + str(min_passes) + "\n" file_text += "; x_overlap: " + str(x_overlap) + "\n" file_text += "; y_overlap: " + str(y_overlap) + "\n" file_text += "; x_step: " + str(x_step) + "\n" file_text += "; y_step: " + str(y_step) + "\n" file_text += _rectOutline(length, width, bit_diameter) min_passes -= 2 while min_passes > 0: file_text += G.G1_XY((x_step, y_step)) current_x += x_step current_y += y_step length -= (2 * x_step) width -= (2 * y_step) file_text += _rectOutline(length, width, bit_diameter) min_passes -= 2 file_text += G.G0_XY((-current_x, -current_y)) file_text += G.set_ABS_mode() return file_text