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.
  • 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")
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.11.tar.gz (555.1 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.11-cp39-abi3-win_amd64.whl (388.3 kB view details)

Uploaded CPython 3.9+Windows x86-64

ezjww-0.2.11-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (488.7 kB view details)

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

ezjww-0.2.11-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (874.6 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.11.tar.gz.

File metadata

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

File hashes

Hashes for ezjww-0.2.11.tar.gz
Algorithm Hash digest
SHA256 9b8cf3c4ca392c17ed8fe73930060072b92260f8ed0f7d1ea94ac88e5b0d2973
MD5 886b3e1038a50e75c871dc855f379c34
BLAKE2b-256 b6cf14649b087789148a1912bb78748e4b8ebab0062e79db15a559798f7e4d5e

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ezjww-0.2.11-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a27fb28a0f79c3ba154ce7d0f6792208a2f5775916df0cbb695e00ec6b77ced3
MD5 7d27cd0f63c2ae548acb9690a5295f2f
BLAKE2b-256 52c1160d2256d295c30ac9fc4c9517a68e22756c6f98599e9e403c3cd0ad7733

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ezjww-0.2.11-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0ee20e5c12481639d97ef134cf652e491e458956e9f61904aec68743ee85f9d4
MD5 0424b799315e92a3931cfb96e1bfe027
BLAKE2b-256 71478be2ee05d6fdf7df2e98fe31f1553eedfeb2603d260e476a6c10ae94ae58

See more details on using hashes here.

File details

Details for the file ezjww-0.2.11-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.11-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 70a0627a6cb5ae2677133bb08bfbe68e52d5326acdd53ff67850bad4d900bd7e
MD5 5ed50130364300198f24fcfd83907e83
BLAKE2b-256 f5032bf0ce64a8046c38f589f9fe618d67c73db6db190978dc23840da8241f77

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.13

4 files

0.2.12

4 files

This release

0.2.11 This release

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