123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- 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
|