{"name": "ParcelFlux", "package_name": "parcelflux", "version": "0.3.0", "experimental": false, "qgis_min": "3.28.0", "qgis_max": "4.99.0", "downloads": 145, "uploaded_by": "geo140195philo", "upload_datetime": "2026-07-28T23:29:43.497806", "changelog": "## [0.3.0] - 2026-07-29\r\n\r\nComplete, verifiable subdivision: nothing is deleted behind your back, planning\r\nrules are enforced during the split, and the plugin finally has a test suite.\r\n\r\n### Fixed\r\n- **Oversized parcels are no longer deleted.** `max_area` used to filter parcels out of the output, which punched holes into the block. With the default 2000 m\u00b2 limit a block whose natural parcels came out larger produced **zero parcels**, and in a multi-block run individual blocks disappeared with no message at all. Oversized parcels are now bisected across the long axis of their oriented bounding box until they fit; a cut that would produce a sliver is abandoned and the parcel is kept whole and flagged. Output area now equals input area.\r\n- **Slivers are merged instead of dropped.** Parcels under 5 m\u00b2 join the merge passes rather than being discarded at write time; only numerical dust below 0.01 m\u00b2 is skipped.\r\n- **Plugin unload leaves no orphan toolbar.** `removeToolBar()` only detaches a toolbar from the layout, so the bar stayed a child of the QGIS window until the deferred delete ran \u2014 a plugin reload could leave the old bar behind. The toolbar, menu and actions are now explicitly re-parented before deletion.\r\n\r\n### Added\r\n- **Minimum frontage** constraint \u2014 parcels whose street frontage (the part of their boundary on the block boundary) falls below the threshold are merged into the neighbour sharing the longest edge. Values at or above the lot width are rejected up front instead of merging everything away.\r\n- **Parcel depth** \u2014 pin the front row to an explicit depth in metres instead of splitting the block at its midpoint. Clamped to 15\u201385% of the block's cross dimension, and takes precedence over H-line shift.\r\n- **Corner widening** \u2014 grow the first and last parcel of each row by a percentage, as many zoning codes require for corner plots; interior parcels absorb the difference so the row span is unchanged.\r\n- **`pf_flag` output column** \u2014 empty for a conforming parcel, otherwise `oversize`, `undersize`, or `narrow`. Flagged parcels stay in the output on purpose.\r\n- **Quality report** after every run: parcel and block counts, coverage %, area min/mean/median/max, mean frontage, and merge/re-split counts. Coverage below 100% now surfaces immediately instead of hiding in the geometry.\r\n- **Preview before adding** (on by default) \u2014 results arrive as a dashed temporary layer with *Apply* and *Discard*.\r\n- **Compare seeds** \u2014 run the same parameters against four seeds and choose from rendered side-by-side thumbnails with each candidate's statistics.\r\n\r\n### Changed\r\n- Frontage measurement is backed by a spatial index over the block boundary edges rather than a linear scan per parcel segment, which is what makes the frontage constraint affordable.\r\n- `max_area` below `min_area` is now rejected as a contradiction instead of silently emptying the output.\r\n\r\n### Quality\r\n- **First automated tests in the plugin's history**: `tests/smoke_core.py` (17 engine checks \u2014 coverage invariants, seed determinism, each planning constraint, parameter validation, irregular-block containment) and `tests/smoke_dock.py` (16 UI and lifecycle checks \u2014 parameter plumbing, report card, preview Apply/Discard, seed gallery rendering, plugin load/unload). Both suites pass on QGIS 3.44 LTR and QGIS 4.2. The unload defect above was found by writing them.", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/parcelflux/version/0.3.0/download/"}