def make_shape_array(self,
                         array_size,
                         shape_area,
                         shape_pitch,
                         type,
                         layer,
                         toplabels=False,
                         sidelabels=False):
        num_of_shapes = int(np.ceil(array_size / shape_pitch))
        base_cell = Cell('Base')

        if 'tris' in type.lower():
            triangle_side = np.sqrt(shape_area / np.sqrt(3) * 4)
            tri_shape = RegPolygon([0, 0], triangle_side, 3, layer=layer)
            tri_cell = Cell('Tri')
            tri_cell.add(tri_shape)
            if 'right' in type.lower():
                base_cell.add(tri_cell, rotation=0)
            elif 'left' in type.lower():
                base_cell.add(tri_cell, rotation=60)
            elif 'down' in type.lower():
                base_cell.add(tri_cell, rotation=30)
            elif 'up' in type.lower():
                base_cell.add(tri_cell, rotation=-30)
        elif type.lower() == "circles":
            circ_radius = np.sqrt(shape_area / np.pi)
            circ = Disk([0, 0], circ_radius, layer=layer)
            base_cell.add(circ)
        elif type.lower() == 'hexagons':
            hex_side = np.sqrt(shape_area / 6. / np.sqrt(3) * 4)
            hex_shape = RegPolygon([0, 0], hex_side, 6, layer=layer)
            hex_cell = Cell('Hex')
            hex_cell.add(hex_shape)
            base_cell.add(hex_cell, rotation=0)

        shape_array = CellArray(base_cell, num_of_shapes, num_of_shapes,
                                [shape_pitch, shape_pitch])
        shape_array_cell = Cell('Shape Array')
        shape_array_cell.add(shape_array)

        if toplabels:
            text = Label('{}'.format(type), 2)
            lblVertOffset = 0.8
            text.translate(
                tuple(
                    np.array(-text.bounding_box.mean(0)) +
                    np.array((array_size / 2., array_size /
                              lblVertOffset))))  # Center justify label
            shape_array_cell.add(text)
        if sidelabels:
            text = Label('a={:.0f}nm2'.format(shape_area * 1000**2), 2)
            lblHorizOffset = 1.5
            text.translate(
                tuple(
                    np.array(-text.bounding_box.mean(0)) +
                    np.array((-array_size / lblHorizOffset,
                              array_size / 2.))))  # Center justify label
            shape_array_cell.add(text)

        return shape_array_cell
def make_shape_array(array_size, shape_area, shape_pitch, type, layer):
    num_of_shapes = int(np.ceil(array_size / shape_pitch))
    base_cell = Cell('Base')
    if type.lower() == "circles":
        circ_radius = np.sqrt(shape_area / np.pi)
        circ = Disk([0, 0], circ_radius, layer=layer)
        base_cell.add(circ)
    elif type.lower() == 'tris_down':
        triangle_side = np.sqrt(shape_area / np.sqrt(3) * 4)
        tri_shape = RegPolygon([0, 0], triangle_side, 3, layer=layer)
        tri_cell = Cell('Tri')
        tri_cell.add(tri_shape)
        base_cell.add(tri_cell, rotation=30)
    elif type.lower() == 'tris_up':
        triangle_side = np.sqrt(shape_area / np.sqrt(3) * 4)
        tri_shape = RegPolygon([0, 0], triangle_side, 3, layer=layer)
        tri_cell = Cell('Tri')
        tri_cell.add(tri_shape)
        base_cell.add(tri_cell, rotation=-30)
    elif type.lower() == 'hexagons':
        hex_side = np.sqrt(shape_area / 6. / np.sqrt(3) * 4)
        hex_shape = RegPolygon([0, 0], hex_side, 6, layer=layer)
        hex_cell = Cell('Hex')
        hex_cell.add(hex_shape)
        base_cell.add(hex_cell, rotation=0)

    shape_array = CellArray(base_cell, num_of_shapes, num_of_shapes,
                            [shape_pitch, shape_pitch])
    shape_array_cell = Cell('Shape Array')
    shape_array_cell.add(shape_array)

    text = Label('{}'.format(type), 2)
    lblVertOffset = 0.8
    text.translate(
        tuple(
            np.array(-text.bounding_box.mean(0)) +
            np.array((array_size / 2.,
                      array_size / lblVertOffset))))  # Center justify label

    shape_array_cell.add(text)

    return shape_array_cell