# Data conversion code is as follows: import vtk def convert_by_line_id(input_path, output_path): points = vtk.vtkPoints() lines = vtk.vtkCellArray() line_id_array = vtk.vtkIntArray() line_id_array.SetName("LineID") # Store point IDs by line ID line_map = {} with open(input_path, 'r', encoding='utf-8') as f: for line_num, raw_line in enumerate(f): s = raw_line.strip() # Skip comments if s.startswith('#'): continue # Skip empty lines (empty lines do not affect segmentation now) if not s: continue parts = s.split() if len(parts) != 5: print(f"Skipping invalid format line {line_num+1}") continue try: x = float(parts[0]) y = float(parts[1]) z = float(parts[2]) # parts[3] is unused and discarded line_id = int(parts[4]) except: print(f"Parsing failed at line {line_num+1}, skipping") continue # Insert point # print(x) # print(y) # print(z) pt_id = points.InsertNextPoint(x, y, z) line_id_array.InsertNextValue(line_id) # Add to the point list of the corresponding line if line_id not in line_map: line_map[line_id] = [] line_map[line_id].append(pt_id) # Generate VTK PolyLine for all lines for lid in sorted(line_map.keys()): pt_ids = line_map[lid] if len(pt_ids) < 2: continue poly_line = vtk.vtkPolyLine() poly_line.GetPointIds().SetNumberOfIds(len(pt_ids)) for i, pid in enumerate(pt_ids): poly_line.GetPointIds().SetId(i, pid) lines.InsertNextCell(poly_line) # Build polydata polydata = vtk.vtkPolyData() polydata.SetPoints(points) polydata.SetLines(lines) polydata.GetPointData().AddArray(line_id_array) # Write VTP file writer = vtk.vtkXMLPolyDataWriter() writer.SetFileName(output_path) writer.SetInputData(polydata) writer.Write() print(f"Completed! Identified {len(line_map)} lines → {output_path}") if __name__ == "__main__": # ========== Modify your file names here ========== INPUT = "E:\BK1-Test2.dat" # Replace with your raw data file name OUTPUT = "E:\BK1-Test2.vtp" # Output VTP file name convert_by_line_id(INPUT, OUTPUT)