[docs]classInterpolationSlicer(BaseSlicer):""" Generates non-planar contours that interpolate user-defined boundaries. Attributes ---------- mesh: :class: 'compas.datastructures.Mesh' Input mesh, it must be a triangular mesh (i.e. no quads or n-gons allowed) Note that the topology of the mesh matters, irregular tesselation can lead to undesired results. We recommend to 1)re-topologize, 2) triangulate, and 3) weld your mesh in advance. preprocessor: :class: 'compas_slicer.pre_processing.InterpolationSlicingPreprocessor' parameters: dict """
[docs]def__init__(self,mesh,preprocessor=None,parameters=None):logger.info('InterpolationSlicer')BaseSlicer.__init__(self,mesh)ifpreprocessor:# make sure the mesh of the preprocessor and the mesh of the slicer matchassertlen(list(mesh.vertices()))==len(list(preprocessor.mesh.vertices()))self.parameters=parametersifparameterselse{}self.preprocessor=preprocessorself.n_multiplier=1.0
[docs]defgenerate_paths(self):""" Generates curved paths. """assertself.preprocessor,'You need to provide a pre-processor in order to generate paths.'avg_layer_height=get_param(self.parameters,key='avg_layer_height',defaults_type='layers')n=find_no_of_isocurves(self.preprocessor.target_LOW,self.preprocessor.target_HIGH,avg_layer_height)params_list=get_interpolation_parameters_list(n)logger.info('%d paths will be generated'%n)max_dist=get_param(self.parameters,key='vertical_layers_max_centroid_dist',defaults_type='layers')vertical_layers_manager=VerticalLayersManager(max_dist)# create paths + layerswithprogressbar.ProgressBar(max_value=len(params_list))asbar:fori,paraminenumerate(params_list):assign_interpolation_distance_to_mesh_vertices(self.mesh,param,self.preprocessor.target_LOW,self.preprocessor.target_HIGH)contours=ScalarFieldContours(self.mesh)contours.compute()contours.add_to_vertical_layers_manager(vertical_layers_manager)bar.update(i)# advance progress barself.layers=vertical_layers_manager.layers
deffind_no_of_isocurves(target_0,target_1,avg_layer_height=1.1):""" Returns the average number of isocurves that can cover the get_distance from target_0 to target_1. """avg_ds0=target_0.get_avg_distances_from_other_target(target_1)avg_ds1=target_1.get_avg_distances_from_other_target(target_0)number_of_curves=((avg_ds0+avg_ds1)*0.5)/avg_layer_heightreturnmax(1,int(number_of_curves))defget_interpolation_parameters_list(number_of_curves):""" Returns a list of #number_of_curves floats from 0.001 to 0.997. """t_list=[0.001]a=list(np.arange(number_of_curves+1)/(number_of_curves+1))a.pop(0)t_list.extend(a)# t_list.append(0.997)returnt_listif__name__=="__main__":pass