frompathlibimportPathfromcompas.colorsimportColorfromcompas.geometryimportLinefromcompas.geometryimportPointfromcompas.geometryimportPointcloudfromcompas_cgal.reconstructionimportpointset_normal_estimationfromcompas_viewerimportViewer# from compas_view2.collections import Collection# Define the file path for the point cloud dataFILE=Path(__file__).parent.parent.parent/"data"/"forked_branch_1.ply"# Load the point cloud data from the PLY filecloud=Pointcloud.from_ply(FILE)# Estimate normals for the point cloudpoints,vectors=pointset_normal_estimation(cloud,16,True)print(f"Original points: {len(cloud)}, Points with normals: {len(points)}, Vectors: {len(vectors)}")# Create lines and properties for visualizing normalslines=[]line_properties=[]line_scale=25# Iterate over points and vectors to create lines and color propertiesforp,vinzip(points,vectors):lines.append(Line(Point(p[0],p[1],p[2]),Point(p[0]+v[0]*line_scale,p[1]+v[1]*line_scale,p[2]+v[2]*line_scale),))# Normalize vector components to be in the range [0, 1] for color representationr=(v[0]+1)*0.5g=(v[1]+1)*0.5b=(v[2]+1)*0.5# Store line color propertiesline_properties.append({"linecolor":Color(r,g,b)})# =============================================================================# Viz# =============================================================================viewer=Viewer()# viewer.renderer.camera.scale = 1000# viewer.view.grid.cell_size = 1000# line_collection = Collection(lines, line_properties)# viewer.scene.add(Pointcloud(points))# viewer.scene.add(line_collection)# viewer.renderer.camera.zoom_extents()viewer.show()