Pure-Python cross-platform parser for Vexy Lines .lines vector art files
Project description
vexy-lines-py
Parse Vexy Lines .lines vector art files in pure Python — no app, no macOS, no heavy dependencies.
Install
pip install vexy-lines-py
Python 3.11+. Runtime dependency: loguru only.
Quick start
from vexy_lines import parse, GroupInfo, LayerInfo
doc = parse("artwork.lines")
print(doc.caption, doc.dpi) # "My Art" 300
print(doc.props.width_mm, "x", doc.props.height_mm, "mm")
# Walk the layer tree
for node in doc.groups:
if isinstance(node, GroupInfo):
for child in node.children:
if isinstance(child, LayerInfo):
for fill in child.fills:
p = fill.params
print(p.fill_type, p.color, f"interval={p.interval}")
# "linear" "#1a2b3c" interval=2.5
# Embedded source image (JPEG)
if doc.source_image_data:
open("source.jpg", "wb").write(doc.source_image_data)
# Embedded preview image (PNG)
if doc.preview_image_data:
open("preview.png", "wb").write(doc.preview_image_data)
Convenience wrappers for image extraction:
from vexy_lines import extract_source_image, extract_preview_image
extract_source_image("artwork.lines", "source.jpg")
extract_preview_image("artwork.lines", "preview.png")
API
Read-only parser. This package parses
.linesfiles but does not support creating or writing them. For creating and manipulating.linesdocuments, usevexy-lines-apywith the MCP API.
parse(path) -> LinesDocument
Parse a .lines file and return a fully populated LinesDocument.
FileNotFoundError— path does not existxml.etree.ElementTree.ParseError— file is not valid XML
parse_string(xml_text) -> LinesDocument
Parse a .lines XML string (in-memory) and return a LinesDocument. Useful when the XML content is already loaded or received from another source.
xml.etree.ElementTree.ParseError— string is not valid XML
extract_source_image(path, output) -> Path
Parse and save the embedded JPEG source image to output. Raises ValueError if no source image is present.
extract_preview_image(path, output) -> Path
Parse and save the embedded PNG preview to output. Raises ValueError if no preview is present.
Types
| Type | Key attributes |
|---|---|
LinesDocument |
caption, version, dpi, props, groups, source_image_data, preview_image_data |
DocumentProps |
width_mm, height_mm, dpi, thickness_min/max, interval_min/max |
GroupInfo |
caption, object_id, expanded, `children: list[GroupInfo |
LayerInfo |
caption, object_id, visible, mask, fills: list[FillNode], grid_edges |
FillNode |
xml_tag, caption, params: FillParams, object_id |
FillParams |
fill_type, color, interval, angle, thickness, smoothness, uplimit, downlimit, multiplier, dispersion, shear, raw |
MaskInfo |
mask_type, invert, tolerance |
FillParams.raw holds every original XML attribute, including algorithm-specific keys not promoted to named fields.
Colors are normalised to #RRGGBB (opaque) or #RRGGBBAA. The raw Vexy Lines #AARRGGBB encoding is converted automatically.
Fill types
11 fill algorithms are recognised in FillParams.fill_type:
| Value | Algorithm | XML Tag |
|---|---|---|
linear |
Parallel straight lines | LinearStrokesTmpl |
wave |
Sine-wave strokes | SigmoidStrokesTmpl |
circular |
Concentric circles | CircleStrokesTmpl |
radial |
Lines radiating from a centre point | RadialStrokesTmpl |
spiral |
Archimedean spirals | SpiralStrokesTmpl |
scribble |
Random scribble-style strokes | ScribbleStrokesTmpl |
halftone |
Halftone dot/line patterns | HalftoneStrokesTmpl |
handmade |
Sketch-style handmade strokes | FreeCurveStrokesTmpl |
fractals |
Fractal / Peano space-filling strokes | PeanoStrokesTmpl |
trace |
Strokes following image contours | TracedAreaTmpl |
source_strokes |
Strokes derived from the source image | SourceStrokes |
FreeCurveStrokesTmpl with attribute type_conv="9" is resolved to trace at parse time (otherwise handmade).
The mapping from XML tags to these names is available as FILL_TAG_MAP. The full set of recognised tags is FILL_TAGS.
Full documentation
Read the docs for the complete API reference, file format specification, and more examples.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vexy_lines_py-1.0.21.tar.gz.
File metadata
- Download URL: vexy_lines_py-1.0.21.tar.gz
- Upload date:
- Size: 10.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7094cd34f74469de4260581929e62ac3e627801138ea44a9b5f0a2e081aba5c5
|
|
| MD5 |
9bd07f8e42bcd357ba55a144d1d472b7
|
|
| BLAKE2b-256 |
9712189a47fa45f6cc53f5c972d9af12c32960cf854981584f113af8590d3710
|
File details
Details for the file vexy_lines_py-1.0.21-py3-none-any.whl.
File metadata
- Download URL: vexy_lines_py-1.0.21-py3-none-any.whl
- Upload date:
- Size: 19.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4746335d93b9bd64e4741ecb3cdde7a48dc3eeae6faf7dd0a1157f12caf5d2d4
|
|
| MD5 |
50b473ae6b0b37a44583b5ec8123a1f7
|
|
| BLAKE2b-256 |
55a516f7e3b1db5cd1f07db2720acd0f86d9aa7a6d993d8a48bc5d13618637a5
|