File format specification for VertexGroup

Planar primitives in a point cloud are defined in VertexGroup (a group of vertices for each primitive). The specification is as follows:

num_points: N        # N is an integer denoting the number of points
x1  y1  z1	     # 3 floating point numbers
...
xN  yN  zN

# the colors of the points
num_colors: N        # N is an integer denoting the number of colors (can be 0; if not, it must equal to num_points)
r1 g1 b1	     # 3 floating point numbers
...
rN gN bN

# the normals of the points
num_normals: N       # N is an integer denoting the number of normals (can be 0; if not, it must equal to num_points)
nx1  ny1  nz1	     # 3 floating point numbers
...
nxN  nyN  nzN

# now we store the segmentation information
num_groups: M        # M is an integer denoting the number of segments/primitives/objects in this point cloud (can be 0)

# now the information for the 1st segment/primitive/object
group_type: type     # integer denoting the of the segment (0: PLANE, 1: CYLINDER, 2: SPHERE, 3: CONE, 4: TORUS, 5: GENERAL)
num_group_parameters: NUM_GROUP_PARAMETERS    # integer number denoting the number of floating point values representing the segment (e.g., 4 for planes)
group_parameters: float[NUM_GROUP_PARAMETERS] # a sequence of NUM_GROUP_PARAMETERS floating point numbers (e.g., a, b, c, and d for a plane)
group_label: label   # the label (a string) of the segment
group_color: r g b   # 3 floating point numbers denoting the color of this segment
group_num_points: N  # N is an integer denoting the number of points in this segment (can be 0)
id1 ... idN          # N integer numbers denoting the indices of the points in this segment
num_children: num    # a segment/primitive/object may contain subsegment (that has the same representation as this segment)
...
group_type: type     # integer denoting the of the segment (0: PLANE, 1: CYLINDER, 2: SPHERE, 3: CONE, 4: TORUS, 5: GENERAL)
num_group_parameters: NUM_GROUP_PARAMETERS    # integer number denoting the number of floating point values representing the segment (e.g., 4 for planes)
group_parameters: float[NUM_GROUP_PARAMETERS] # a sequence of NUM_GROUP_PARAMETERS floating point numbers (e.g., a, b, c, and d for a plane)
group_label: label   # the label (a string) of the segment
group_color: r g b   # 3 floating point numbers denoting the color of this segment
group_num_points: N  # N is an integer denoting the number of points in this segment (can be 0)
id1 ... idN          # N integer numbers denoting the indices of the points in this segment
num_children: num    # a segment/primitive/object may contain subsegment (that has the same representation as this segment)
...

To create such data from a point cloud, you can use Mapple in Easy3D.

Credit to @LiangliangNan for the vertex group data structure and the above specification.