Skip to main content

Photometric polar diagram generator for EULUMDAT (.ldt) files — extension to eulumdat-py

Project description

eulumdat-plot

PyPI PyPI - Python Version License: MIT DOI

Photometric polar diagram generator for EULUMDAT (.ldt) files — designed for product datasheets and publication-ready documents.

Reads a .ldt file and produces a Lumtopic-style SVG: a square image with a top banner and a polar candela distribution diagram showing the C0/C180 (solid) and C90/C270 (dotted) curves, scaled to fill the plot area.

For scientific / interactive plots (matplotlib, axis labels, legends), see the eulumdat-py examples.

Part of the eulumdat-* ecosystem, built on top of eulumdat-py.



Features

  • Reads any EULUMDAT file — all symmetry types (ISYM 0–4) handled by eulumdat-py
  • Generates a publication-ready SVG polar diagram (Lumtopic style)
  • Dynamic radial scale (3–6 concentric circles, round values)
  • Dominant-hemisphere detection for automatic scale label placement
  • Proportional scaling via Layout.for_size(n) — one parameter controls everything
  • Optional I(γ) interpolation (linear or cubic spline) for smooth curves
  • Optional raster export to PNG and JPEG (cross-platform, no native DLL)
  • Debug mode for visual validation of C-plane assignment

Installation

Core package (SVG generation only):

pip install eulumdat-plot

With raster export (PNG / JPEG):

pip install "eulumdat-plot[export]"

With cubic spline interpolation:

pip install "eulumdat-plot[cubic]"

Everything:

pip install "eulumdat-plot[full]"

Quick start

from eulumdat_plot import plot_ldt

# Generate an SVG next to the source file
svg = plot_ldt("luminaire.ldt")

# With a distribution code in the banner centre
svg = plot_ldt("luminaire.ldt", code="D53")

Scaling

All visual parameters (stroke widths, font sizes, margins) scale proportionally from the 1181 px reference with a single call:

from eulumdat_plot import plot_ldt, Layout

svg = plot_ldt("luminaire.ldt", layout=Layout.for_size(600))

Raster export

from eulumdat_plot import plot_ldt, Layout
from eulumdat_plot.export import svg_to_png, svg_to_jpg

svg = plot_ldt("luminaire.ldt", layout=Layout.for_size(1181))
png = svg_to_png(svg, size_px=600)
jpg = svg_to_jpg(svg, size_px=600, quality=95)

The export size is independent of the SVG canvas size.

API reference

plot_ldt()

def plot_ldt(
    ldt_path: str | Path,
    svg_path: str | Path | None = None,
    *,
    code: str = "",
    layout: Layout | None = None,
    interpolate: bool = True,
    interp_step_deg: float = 1.0,
    interp_method: str = "linear",
    debug: bool = False,
) -> Path
Parameter Default Description
ldt_path Source .ldt file
svg_path same name, .svg Output SVG path
code "" Distribution code shown in the banner centre
layout Layout() Visual parameters
interpolate True Resample I(γ) before plotting
interp_step_deg 1.0 Angular step for resampling (degrees)
interp_method "linear" "linear" or "cubic" (requires scipy)
debug False Colour-code C-planes for visual validation

Layout.for_size()

Layout.for_size(size_px: int) -> Layout

Creates a Layout with all dimensions scaled proportionally from the 1181 px reference. Layout.for_size(1181) is identical to Layout().

svg_to_png() / svg_to_jpg()

svg_to_png(svg_path, png_path=None, *, size_px=1181, background="#FFFFFF") -> Path
svg_to_jpg(svg_path, jpg_path=None, *, size_px=1181, background="#FFFFFF", quality=95) -> Path

Requires pip install "eulumdat-plot[export]".

Examples

File Description
examples/01_basic_usage.md Generate an SVG from a .ldt file
examples/02_resize_and_export.md Scaling, raster export, batch processing

Project structure

eulumdat-plot/
├── data/
│   ├── input/          # sample .ldt files (ISYM 0–4)
│   └── output/         # generated SVG / PNG / JPEG
├── docs/
│   └── img/
│       └── sample_01.svg
├── examples/
│   ├── 01_basic_usage.md
│   └── 02_resize_and_export.md
├── src/
│   └── eulumdat_plot/
│       ├── __init__.py
│       ├── plot.py     # public API — LDT → SVG pipeline
│       ├── renderer.py # SVG renderer + Layout dataclass
│       └── export.py   # raster export (PNG / JPEG)
├── tests/
│   ├── test_smoke.py   # 46 real LDT files, all ISYM types
│   └── test_scaling.py # Layout.for_size() proportionality
├── pyproject.toml
├── CHANGELOG.md
└── README.md

EULUMDAT ecosystem

Package Status Description
eulumdat-py v0.1.4 Read / write EULUMDAT files
eulumdat-symmetry v1.0.0 Symmetrise EULUMDAT files
eulumdat-plot v1.0.0 Photometric polar diagram — this package
eulumdat-luminance planned Luminance table cd/m² (γ 55°–85°)
eulumdat-ugr planned UGR calculation (CIE 117, CIE 190)

Requirements

  • Python ≥ 3.9
  • eulumdat-py ≥ 1.0.0
  • numpy ≥ 1.21
  • svgwrite ≥ 1.4
  • (optional) vl-convert-python ≥ 1.6 + Pillow ≥ 9.0 — raster export
  • (optional) scipy ≥ 1.7 — cubic spline interpolation

License

MIT — © 2024 123VincentB

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

eulumdat_plot-1.0.3.tar.gz (22.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

eulumdat_plot-1.0.3-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

Details for the file eulumdat_plot-1.0.3.tar.gz.

File metadata

  • Download URL: eulumdat_plot-1.0.3.tar.gz
  • Upload date:
  • Size: 22.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for eulumdat_plot-1.0.3.tar.gz
Algorithm Hash digest
SHA256 58a656c40ba561fea88d45e6110a8320e6228fb292b1f3d20090e3a10aba49ab
MD5 d1231a37e97cdf75cf0cc78e8aa6bf38
BLAKE2b-256 c4c048e6567132f3a9e6e52524bc78a6918a5b23251172451fdfcf9560bd5db4

See more details on using hashes here.

File details

Details for the file eulumdat_plot-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: eulumdat_plot-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 18.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for eulumdat_plot-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 b9768ad8b9481c03845b8a2a37994c654f408541a1c74c2a2a13716712d47e3d
MD5 dad8158b6c51dfaba64640f9f0599529
BLAKE2b-256 857cd4053704277fa4c4a38b556f7d199f706450f338a21325ccc7dbff937617

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page