76 lines
2.1 KiB
Python
76 lines
2.1 KiB
Python
"""JSON output generator — structured path data from PostProcessResult."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from pipeline.postprocess import PathInfo, PostProcessResult
|
|
|
|
|
|
def _path_to_dict(path: PathInfo) -> dict:
|
|
"""Convert a PathInfo to a JSON-serializable dict with path commands."""
|
|
commands = []
|
|
coords = path.simplified_coords
|
|
if not coords:
|
|
return {"commands": [], "properties": {}}
|
|
|
|
# Move to start
|
|
commands.append({"type": "M", "x": coords[0][0], "y": coords[0][1]})
|
|
|
|
# Line to each subsequent point
|
|
for x, y in coords[1:]:
|
|
commands.append({"type": "L", "x": x, "y": y})
|
|
|
|
# Close if applicable
|
|
if path.is_closed:
|
|
commands.append({"type": "Z"})
|
|
|
|
properties = {
|
|
"is_closed": path.is_closed,
|
|
"is_island": path.is_island,
|
|
"node_count": path.node_count,
|
|
"original_node_count": path.original_node_count,
|
|
"area": round(path.area, 4),
|
|
}
|
|
|
|
return {"commands": commands, "properties": properties}
|
|
|
|
|
|
def generate_json(result: PostProcessResult) -> str:
|
|
"""Generate a JSON string from post-processed path data.
|
|
|
|
Output format:
|
|
{
|
|
"paths": [
|
|
{
|
|
"commands": [{"type": "M", "x": 0, "y": 0}, {"type": "L", "x": 10, "y": 0}, ...],
|
|
"properties": {"is_closed": true, "is_island": false, ...}
|
|
},
|
|
...
|
|
],
|
|
"metadata": {
|
|
"path_count": 2,
|
|
"total_nodes": 10,
|
|
"total_original_nodes": 50,
|
|
"open_path_count": 0,
|
|
"island_count": 1
|
|
}
|
|
}
|
|
|
|
Args:
|
|
result: PostProcessResult from the post-processing pipeline.
|
|
|
|
Returns:
|
|
JSON string.
|
|
"""
|
|
output = {
|
|
"paths": [_path_to_dict(p) for p in result.paths],
|
|
"metadata": {
|
|
"path_count": len(result.paths),
|
|
"total_nodes": result.total_nodes,
|
|
"total_original_nodes": result.total_original_nodes,
|
|
"open_path_count": result.open_path_count,
|
|
"island_count": result.island_count,
|
|
},
|
|
}
|
|
return json.dumps(output, indent=2)
|