Unwrapping a circle into a line of segments?
Rollout Fan


Test run, cone: 12 segments, triangle fan view, default UV map, aligned to view

Script, templated from  text editor &gt; templates &gt; python &gt; Operator Mesh UV  Logic:


For the selected vertex, get all the linked tri faces.
Transform the selection such that vertex coordinate is zero, vertex normal
is z axis, ie translate by the vector coordinate and rotate such that
the normal is now up, using the rotation difference.
Calculate the perimeter by summing lengths of all  edges that dont
include center vertex of faces .
Much like a Mercator projection, map the angle difference of Y axis
to each transformed perimeter vertex to U.  Will be in range -pi to
pi, or -180 to 180 degrees.


To Install:


Run the script in text editor Only once to register


To Run:


In edit mode select the center vertex of the circle fan
Run the operator, F3 Circle Unfold 


NOTE: 

The script is written for 2.8.  Have added addon header to reflect this.

For prior versions replace @ with * except @classmethod and blender version to "blender" : (2, 78, 0) if installing as addon.

bl_info = {
    "name": "UV Unfurl Circle",
    "author": "batFINGER",
    "version": (1, 0),
    "blender": (2, 80, 0),
    "location": "View3D &gt; UV &gt; Circle Unfurl",
    "description": "Select circle center vertex, to unfurl UV",
    "warning": "",
    "wiki_url": "",
    "category": "UV",
}

import bpy
import bmesh
from mathutils import Vector, Matrix

def main(obj, up=Vector((0, 0, 1)), to=Vector((0, 1))):

    from math import pi
    me = obj.data
    bm = bmesh.from_edit_mesh(me)

    uv_layer = bm.loops.layers.uv.verify()
    v = bm.select_history.active
    if not isinstance(v, bmesh.types.BMVert):
        print("Not a vert")
        return False      

    tris = [t for t in v.link_faces if len(t.edges) == 3]      
    n = v.normal
    T = Matrix.Translation(-v.co)
    R = n.rotation_difference(up).to_matrix().to_4x4()

    # calc perimeter

    p = sum(e.calc_length() for f in tris for e in f.edges 
            if not any(v in e.verts for x in e.verts))

    for f in tris:
        f.select = True
        e = next(e for e in f.edges if v not in e.verts)
        e.select = True
        ec = sum([v.co for v in e.verts], Vector()) / 2
        fu = R @ (T @ ec)
        fx = to.xy.angle_signed(fu.xy)

        for l in f.loops:
            luv = l[uv_layer]
            y = 0

            if l.vert is v:
                x,y = fx, (ec - v.co).length
            else:
                u = R @ (T @ l.vert.co)
                x = to.xy.angle_signed(u.xy)
                if abs(fx - x) &gt;= 1.5 * pi:
                    x -= 2 * pi if x &gt; 0 else -2 * pi        
            luv.uv = (x + pi) / (2 * pi), y / p

    bmesh.update_edit_mesh(me)


class UV_OT_circle_unfurl(bpy.types.Operator):
    """Circle Unfurl
    Select circle fan center vertex
    Unfurl perimeter to U = 0
    """
    bl_idname = "uv.circle_unfurl"
    bl_label = "UV Circle Unfurl"

    @classmethod
    def poll(cls, context):
        return (context.mode == 'EDIT_MESH')

    def execute(self, context):
        main(context.edit_object)
        return {'FINISHED'}

def draw(self, context):
    ''' menu item '''
    self.layout.operator("uv.circle_unfurl")

def register():
    bpy.utils.register_class(UV_OT_circle_unfurl)
    bpy.types.VIEW3D_MT_uv_map.append(draw)


def unregister():
    bpy.types.VIEW3D_MT_uv_map.remove(draw)
    bpy.utils.unregister_class(UV_OT_circle_unfurl)


if __name__ == "__main__":
    register()