Spaces:
Runtime error
Runtime error
from __future__ import annotations | |
from typing import TYPE_CHECKING, cast | |
from contourpy import FillType, LineType | |
from contourpy.util.mpl_util import mpl_codes_to_offsets | |
if TYPE_CHECKING: | |
from contourpy._contourpy import ( | |
CoordinateArray, | |
FillReturn, | |
LineReturn, | |
LineReturn_Separate, | |
LineReturn_SeparateCode, | |
) | |
def filled_to_bokeh( | |
filled: FillReturn, | |
fill_type: FillType, | |
) -> tuple[list[list[CoordinateArray]], list[list[CoordinateArray]]]: | |
xs: list[list[CoordinateArray]] = [] | |
ys: list[list[CoordinateArray]] = [] | |
if fill_type in ( | |
FillType.OuterOffset, | |
FillType.ChunkCombinedOffset, | |
FillType.OuterCode, | |
FillType.ChunkCombinedCode, | |
): | |
have_codes = fill_type in (FillType.OuterCode, FillType.ChunkCombinedCode) | |
for points, offsets in zip(*filled): | |
if points is None: | |
continue | |
if have_codes: | |
offsets = mpl_codes_to_offsets(offsets) | |
xs.append([]) # New outer with zero or more holes. | |
ys.append([]) | |
for i in range(len(offsets) - 1): | |
xys = points[offsets[i] : offsets[i + 1]] | |
xs[-1].append(xys[:, 0]) | |
ys[-1].append(xys[:, 1]) | |
elif fill_type in ( | |
FillType.ChunkCombinedCodeOffset, | |
FillType.ChunkCombinedOffsetOffset, | |
): | |
for points, codes_or_offsets, outer_offsets in zip(*filled): | |
if points is None: | |
continue | |
for j in range(len(outer_offsets) - 1): | |
if fill_type == FillType.ChunkCombinedCodeOffset: | |
codes = codes_or_offsets[outer_offsets[j] : outer_offsets[j + 1]] | |
offsets = mpl_codes_to_offsets(codes) + outer_offsets[j] | |
else: | |
offsets = codes_or_offsets[ | |
outer_offsets[j] : outer_offsets[j + 1] + 1 | |
] | |
xs.append([]) # New outer with zero or more holes. | |
ys.append([]) | |
for k in range(len(offsets) - 1): | |
xys = points[offsets[k] : offsets[k + 1]] | |
xs[-1].append(xys[:, 0]) | |
ys[-1].append(xys[:, 1]) | |
else: | |
raise RuntimeError( | |
f"Conversion of FillType {fill_type} to Bokeh is not implemented" | |
) | |
return xs, ys | |
def lines_to_bokeh( | |
lines: LineReturn, | |
line_type: LineType, | |
) -> tuple[list[CoordinateArray], list[CoordinateArray]]: | |
xs: list[CoordinateArray] = [] | |
ys: list[CoordinateArray] = [] | |
if line_type == LineType.Separate: | |
if TYPE_CHECKING: | |
lines = cast(LineReturn_Separate, lines) | |
for line in lines: | |
xs.append(line[:, 0]) | |
ys.append(line[:, 1]) | |
elif line_type == LineType.SeparateCode: | |
if TYPE_CHECKING: | |
lines = cast(LineReturn_SeparateCode, lines) | |
for line in lines[0]: | |
xs.append(line[:, 0]) | |
ys.append(line[:, 1]) | |
elif line_type in (LineType.ChunkCombinedCode, LineType.ChunkCombinedOffset): | |
for points, offsets in zip(*lines): | |
if points is None: | |
continue | |
if line_type == LineType.ChunkCombinedCode: | |
offsets = mpl_codes_to_offsets(offsets) | |
for i in range(len(offsets) - 1): | |
line = points[offsets[i] : offsets[i + 1]] | |
xs.append(line[:, 0]) | |
ys.append(line[:, 1]) | |
else: | |
raise RuntimeError( | |
f"Conversion of LineType {line_type} to Bokeh is not implemented" | |
) | |
return xs, ys | |