Skip to main content

ezjww

ezjww is a JWW parser and DXF conversion library. The core parser/writer is implemented in Rust and exposed to Python with PyO3.

Current Features

  • Validate and parse .jww files by their JwwData. binary signature.
  • Report structured CP932 replacement diagnostics with source byte offsets.
  • Read JWW files written by Jw_cad 8 (version 700, Unicode builds): CStrings with the MFC FF FE FF marker are decoded as UTF-16LE, and block definitions (whose list count is a WORD) are loaded.
  • Read damaged files best-effort: a main entity list that cannot be read to its end keeps the entities parsed so far and reports ENTITY_LIST_TRUNCATED (see docs/DIAGNOSTICS.md); MFC CArchive escaped counts (65535+ entities), NULL tags and big object tags are honoured.
  • Read document/header data from Python.
  • Expose Jw_cad's sentinel-positioned printer/view settings separately as metadata_settings while preserving the original source entities.
  • Convert parsed JWW entities to DXF intermediate entities.
  • Write ASCII DXF files.
  • Emit DXF handles, BLOCK_RECORD table, and OBJECTS section for better CAD compatibility.

Installation

Install the package from PyPI:

pip install ezjww

If you want to use the optional plotting feature, install the package with the plot extra:

pip install "ezjww[plot]"

Install the package from source:

git clone https://github.com/neka-nat/ezjww.git
cd ezjww
uv sync

Python API

from ezjww import (
    ALL_ISSUE_CODES,
    audit,
    bbox,
    is_jww_file,
    readfile,
    plot_jww,
    read_document,
    read_dxf_document,
    report,
    stats,
    to_dxf_string,
    write_dxf,
    write_dxf_with_report,
)

ok = is_jww_file("sample.jww")
doc = read_document("sample.jww")
for setting in doc["metadata_settings"]:
    print(setting["key"], setting["value"])
dxf_doc = read_dxf_document("sample.jww")
dxf_text = to_dxf_string("sample.jww")
write_dxf("sample.jww", "sample.dxf")
conversion = write_dxf_with_report(
    "sample.jww",
    "sample-r2010.dxf",
    target_version="AC1024",
)
plot_jww("sample.jww", save_path="sample.png")

drawing = readfile("sample.jww")
msp = drawing.modelspace()
lines = msp.query("LINE", layer="#lv4")
mix = msp.query('LINE POINT[layer=="#lv4", color==5]')  # ezdxf-like selector
extents = drawing.bbox(explode_inserts=True)
raw_dxf = drawing.to_dxf_string()
dist = drawing.stats()
health = drawing.audit()  # or: audit("sample.jww")
for diagnostic in health["diagnostics"]:
    print(diagnostic["code"], diagnostic["details"])

# Stable machine-readable catalog for integrations and CI.
assert set(health["issue_codes"]) <= set(ALL_ISSUE_CODES)
full = report("sample.jww", explode_inserts=True)

# expand INSERT references (nested block aware)
flat = drawing.to_dxf(explode_inserts=True, max_block_nesting=32)
flat_count = len(flat["entities"])
# max_block_nesting must be >= 1

CLI

The package installs the ezjww command.

# show summary
ezjww info jww_samples/Test1.jww

# run health checks
ezjww audit jww_samples/Test1.jww --json

# calculate drawing extents
ezjww bbox jww_samples/Test1.jww --json --explode-inserts

# show entity distribution
ezjww stats jww_samples/Test1.jww --json

# show combined audit+bbox+stats
ezjww report jww_samples/Test1.jww --json --explode-inserts

# convert one file
ezjww to-dxf jww_samples/Test1.jww -o /tmp/Test1.dxf

# convert one file + JSON report
ezjww to-dxf jww_samples/Test1.jww -o /tmp/Test1.dxf --report json

# convert one file with INSERT expansion
ezjww to-dxf jww_samples/Test1.jww -o /tmp/Test1.dxf --explode-inserts

# convert directory (recursive)
ezjww to-dxf-dir jww_samples -o /tmp/dxf_out -r

# render with matplotlib
ezjww plot jww_samples/Test1.jww -o /tmp/Test1.png --explode-inserts

Public contracts

is_jww_file(path) checks file content, not the filename extension. A matching signature is only a lightweight format check; parsing still validates the remaining structure.

Development

cargo fmt --all
cargo test
maturin develop

Download files

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

Source Distribution

ezjww-0.2.12.tar.gz (557.2 kB view details)

Uploaded Source

Built Distributions

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

ezjww-0.2.12-cp39-abi3-win_amd64.whl (390.8 kB view details)

Uploaded CPython 3.9+Windows x86-64

ezjww-0.2.12-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (490.8 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

ezjww-0.2.12-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (879.4 kB view details)

Uploaded CPython 3.9+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file ezjww-0.2.12.tar.gz.

File metadata

  • Download URL: ezjww-0.2.12.tar.gz
  • Upload date:
  • Size: 557.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.15.0

File hashes

Hashes for ezjww-0.2.12.tar.gz
Algorithm Hash digest
SHA256 fa56022b3fdf2d6a2a8f6e8e5a76d2250be8271c22c613e460b27b75684e93ef
MD5 bb09db207d145dda1ba5f5a3be4d2c08
BLAKE2b-256 f4c13742b69f24a622a2b54fefb2914c992647b4f2be8800a8d50c7b651b09b1

See more details on using hashes here.

File details

Details for the file ezjww-0.2.12-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: ezjww-0.2.12-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 390.8 kB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.15.0

File hashes

Hashes for ezjww-0.2.12-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 15a1c191cbb00108dcd0a7ae0603c1781d1c4d47a4b8b012e90c2262e0769005
MD5 83657da171c246f447c24f32e4d7e692
BLAKE2b-256 a08426acbc5ed35fba7be52555f6e900b7c57dbba07bc804a4df2bcd33bd2afd

See more details on using hashes here.

File details

Details for the file ezjww-0.2.12-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ezjww-0.2.12-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 00ba2493b72a12a54d0651cdedc2a13257e8ee768d0cf8ff61a8c4f100940e43
MD5 f874a9f0540d58debced370b219a1a20
BLAKE2b-256 6a20fec48322a9f66df7d81635738382b7faf8a468cc5c400c8a14dcd36bbe32

See more details on using hashes here.

File details

Details for the file ezjww-0.2.12-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for ezjww-0.2.12-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 b26fd8ee4d0d00793b6ba3281f63746930df2496ce165dee3cbaf9a9dbfd1167
MD5 14a4d9278dbeca49a817fcb4d3697dc3
BLAKE2b-256 20a44f174953eefc31602592c4a287bb9fc7cff1c8330c2dea0069730daad768

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.13

4 files

This release

0.2.12 This release

4 files

0.2.11

4 files

0.2.10

4 files

0.2.9

4 files

0.2.8

4 files

0.2.7

4 files

0.2.6

4 files

0.2.5

4 files

0.2.4

4 files

0.2.3

4 files

0.2.2

4 files

0.2.1

4 files

0.2.0

4 files

0.1.0

4 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page