Source code for tidy3d.components.viz.visualization_spec

from __future__ import annotations

from typing import Any, Optional

import pydantic.v1 as pd

from tidy3d.components.base import Tidy3dBaseModel
from tidy3d.log import log

MATPLOTLIB_IMPORTED = True
try:
    from matplotlib.colors import is_color_like
except ImportError:
    is_color_like = None
    MATPLOTLIB_IMPORTED = False


def is_valid_color(value: str) -> str:
    if not MATPLOTLIB_IMPORTED:
        log.warning(
            "matplotlib was not successfully imported, but is required "
            "to validate colors in the VisualizationSpec. The specified colors "
            "have not been validated."
        )
    else:
        if is_color_like is not None and not is_color_like(value):
            raise ValueError(f"{value} is not a valid plotting color")

    return value


[docs] class VisualizationSpec(Tidy3dBaseModel): """Defines specification for visualization when used with plotting functions.""" facecolor: str = pd.Field( "", title="Face color", description="Color applied to the faces in visualization.", ) edgecolor: Optional[str] = pd.Field( "", title="Edge color", description="Color applied to the edges in visualization.", ) alpha: Optional[pd.confloat(ge=0.0, le=1.0)] = pd.Field( 1.0, title="Opacity", description="Opacity/alpha value in plotting between 0 and 1.", )
[docs] @pd.validator("facecolor", always=True) def validate_color(value: str) -> str: return is_valid_color(value)
[docs] @pd.validator("edgecolor", always=True) def validate_and_copy_color(value: str, values: dict[str, Any]) -> str: if (value == "") and "facecolor" in values: return is_valid_color(values["facecolor"]) return is_valid_color(value)