Source code for compas_slicer.post_processing.seams_smooth


import logging
from compas.geometry import distance_point_point
from compas.geometry import Vector
import compas_slicer

logger = logging.getLogger('logger')

__all__ = ['seams_smooth']


[docs]def seams_smooth(slicer, smooth_distance): """Smooths the seams (transition between layers) by removing points within a certain distance. Parameters ---------- slicer: :class:`compas_slicer.slicers.BaseSlicer` An instance of one of the compas_slicer.slicers classes. smooth_distance: float Distance (in mm) to perform smoothing """ logger.info("Smoothing seams with a distance of %i mm" % smooth_distance) for i, layer in enumerate(slicer.layers): if len(layer.paths) == 1 or isinstance(layer, compas_slicer.geometry.VerticalLayer): for j, path in enumerate(layer.paths): if path.is_closed: # only for closed paths pt0 = path.points[0] # only points in the first half of a path should be evaluated half_of_path = path.points[:int(len(path.points)/2)] for point in half_of_path: if distance_point_point(pt0, point) < smooth_distance: # remove points if within smooth_distance path.points.pop(0) else: # create new point at a distance of the # 'smooth_distance' from the first point, # so that all seams are of equal length vect = Vector.from_start_end(pt0, point) vect.unitize() new_pt = pt0 + (vect * smooth_distance) path.points.insert(0, new_pt) path.points.pop(-1) # remove last point break else: logger.warning("Smooth seams only works for layers consisting out of a single path, or for vertical layers." "\nPaths were not changed, seam smoothing skipped for layer %i" % i)
if __name__ == "__main__": pass