Skip to content

Releases: studiomedio/blender-point-cloud-io

v0.6.0 — Choose which attributes get exported

Choose a tag to compare

@studiomedio studiomedio released this 11 Sep 08:15

Added

  • Pick the source attribute for each export channel. Every export dialog gains a Source Attributes section with a dropdown per channel the format carries — Color and Intensity everywhere they apply, plus Classification, Return Number and Number of Returns for LAS. Each is Auto by default, can be set to None to leave the channel out, or pointed at any attribute of a compatible type, including attributes created by Geometry Nodes. Previously the exporters only looked for the exact names color, normal, intensity, classification, return_number and number_of_returns, so a cloud that had not come through this add-on's importers exported without that data.
  • Wider auto-detection. Names are matched with case and punctuation ignored, so CloudCompare's scalar_Intensity, Scalar Intensity and intensity all resolve to the same channel. Common aliases from other tools are recognised too — Col / rgb / diffuse_color for color, reflectance / amplitude for intensity, and so on. The full table is in the README.
  • Export warnings for data left behind. The export dialog now lists attributes the file will not carry before you click Export, and the same list is reported afterwards instead of the export finishing silently. Deliberate omissions — a channel set to None, or a column checkbox switched off — are not reported.
  • Zenodo DOI — releases are now archived on Zenodo and the project has a citation DOI (10.5281/zenodo.20488833). A DOI badge linking to the concept DOI is shown at the top of the README.

Fixed

  • PLY no longer drops attributes it cannot name. The writer passed through FLOAT, INT and BOOLEAN attributes but silently skipped every other type, so a FLOAT_COLOR named Col or a FLOAT_VECTOR named Nx vanished from the output. Unclaimed vector and color attributes are now written as <name>_x/_y/_z and <name>_r/_g/_b component columns.
  • Scalar channels accept non-float attributes. Reading an INT or BOOLEAN attribute as intensity used to fill a float buffer through foreach_get and fail; the value is now converted. Color channels likewise accept 3-component FLOAT_VECTOR and BYTE_COLOR attributes, not just FLOAT_COLOR.

Changed

  • Export operators share a common base. Selection filtering, modifier evaluation and the skipped-object list were duplicated across all six exporters; they now live in operators/_base.py, alongside the attribute-role dropdowns and reporting. Attribute naming and detection live in formats/_attrs.py.

v0.5.2 — Python 3.14 wheel compatibility

Choose a tag to compare

@studiomedio studiomedio released this 04 Aug 22:37

Fixed

  • Python 3.14 compatibility. The extension previously bundled cp313 wheels only, so Blender builds running Python 3.14 — distribution packages and self-built Blender linked against a newer system Python, rather than the official builds, which ship 3.13 — rejected the extension at install time with "This Python version (3.14) isn't compatible with (3.13)". pye57 and lazrs now ship cp314 wheels alongside the cp313 ones; Blender selects the matching tag at install time. Official Blender 5.1.x builds are unaffected either way.

Changed

  • lazrs bumped 0.8.1 → 0.8.2. 0.8.1 published no cp313 Linux aarch64 wheel; 0.8.2 does, which is what makes LAZ on ARM Linux possible.
  • Wider platform coverage for LAS/LAZ. lazrs wheels for macOS x86_64 and Linux aarch64 are now bundled, so LAZ read/write works on Intel Mac and ARM Linux for the first time.
  • Releases are now split per platform. Doubling the wheel count took a universal build from 22 MB to 48 MB, so the manifest declares platforms and releases are built with blender --command extension build --split-platforms. Each download now carries only its own wheels — 6.2 MB (macOS arm64), 3.2 MB (Windows x64), 1.2 MB (macOS x64), 1.3 MB (Linux arm64), 34.2 MB (Linux x64).

Known limitations

  • E57 remains unavailable on Intel Mac and ARM Linux. Upstream pye57 publishes wheels for macOS arm64, Linux x86_64, and Windows x86_64 only — there is nothing to bundle for the other two platforms. All other formats work there.

v0.5.1 — Shorten tagline for Blender Extensions

Choose a tag to compare

@studiomedio studiomedio released this 01 Jun 11:40

Fixed

  • Tagline shortened to fit Blender Extensions' 64-character limit. The v0.5.0 tagline ("Import and export E57, PLY, LAS, LAZ, PCD, XYZ and PTS point cloud files", 71 chars) was rejected on upload; the manifest now reads "Import and export E57, PLY, LAS, LAZ, PCD, XYZ, PTS files" (57 chars). No code changes.

v0.5.0 — PTS (Leica Cyclone) support

Choose a tag to compare

@studiomedio studiomedio released this 01 Jun 11:13

Added

  • PTS import via File > Import > PTS Point Cloud (.pts).
    • Reads the Leica Cyclone text format: integer count header line, then one point per line.
    • Auto-detects the column layout from row width — 3 (x y z), 4 (+ intensity), 6 (+ rgb), or 7 (+ intensity + rgb, Leica canonical).
    • Intensity is normalised to 0–1; RGB auto-detects 0–255 vs 0–1.
  • PTS export via File > Export > PTS Point Cloud (.pts).
    • Writes the count header followed by x y z [intensity] [r g b] rows.
    • Intensity is scaled back to the 0–2047 Leica integer range; RGB written as uint8 0–255.
    • Independent Write Intensity / Write Colors tickboxes.
  • Pure-Python + numpy implementation — no new wheel dependencies.

⚠ Use v0.5.1 instead — this version's tagline failed Blender Extensions' validator

v0.4.0 — PCD (ascii/binary/LZF) and XYZ

Choose a tag to compare

@studiomedio studiomedio released this 28 May 16:49

Added

  • PCD import via File > Import > PCD Point Cloud (.pcd).
    • Reads positions, packed RGB / RGBA (PCL float-packed convention), normals (normal_x/y/z), intensity, and other per-point scalar fields as point attributes.
    • Supports ascii and binary DATA modes. binary_compressed (LZF) raises a clear "convert first" error rather than failing silently.
  • PCD export via File > Export > PCD Point Cloud (.pcd).
    • Writes a single unordered cloud (HEIGHT = 1) with x y z + optional normal_x/y/z, packed rgb, and intensity.
    • Binary by default; ASCII tickbox for debugging.
  • PCD binary_compressed (LZF) read and write support. A pure-Python LZF codec (formats/_lzf.py) handles both decompression on read and compression on write — no new wheels. The PCD exporter's previous ASCII tickbox is replaced with a Data Mode dropdown: Binary (default) / Binary Compressed (LZF) / ASCII.
  • XYZ import via File > Import > XYZ Point Cloud (.xyz, .txt, .csv).
    • Plain text with no header; column layout inferred from column count (3 / 4 / 6 / 7 / 9 columns recognised; anything else becomes opaque extra_* FLOAT attributes).
    • Auto-detects comma vs whitespace separator; skips #-prefixed comment lines.
  • XYZ export via File > Export > XYZ Point Cloud (.xyz).
    • ASCII output. Independent tickboxes for intensity, RGB, and normals.

Bundled wheels

  • No new wheels — both PCD and XYZ readers/writers are pure-Python + numpy.

Fixed

  • NaN-positioned points are dropped on import (_common.build_point_cloud). PCL convention is that depth-camera pixels with invalid range get NaN coordinates; one of those slipping into the bbox computation poisoned suggest_radius (which then returned NaN), so the radius shown in the N-panel was NaN and the cloud rendered invisibly. Triggered most visibly by office1.pcd and other organized RGB-D PCDs.
  • suggest_radius is now NaN-safe as a defense-in-depth — strays in scenes created by other paths (Geometry Nodes, scripts) no longer break the panel's Auto button either.

v0.3.0 — LAS/LAZ support

Choose a tag to compare

@studiomedio studiomedio released this 28 May 11:51

Added

  • LAS / LAZ import via File > Import > LAS/LAZ Point Cloud (.las, .laz).
    • Reads positions (with file scale + offset applied), 16-bit RGB normalised to 0–1, intensity normalised to 0–1, ASPRS classification (uint8 → INT attribute), and optional return-number / number-of-returns.
    • LAZ decompression via the bundled lazrs codec.
    • Center on Origin option (on by default) subtracts the data minimum from positions before casting to float32, so georeferenced LiDAR (UTM, State Plane, etc.) lands near the world origin and stays within float32 precision. The subtracted offset is stored as a las_origin_offset custom property on the object and added back automatically on export, preserving the original coordinate system through a Blender round-trip.
  • LAS / LAZ export via File > Export > LAS/LAZ Point Cloud (.las, .laz).
    • Writes Point Data Record Format 3 (LAS 1.2) — positions, RGB, intensity, classification, return info, GPS time slot.
    • Positions quantised to millimeter precision with offset set to the data minimum.
    • Compress (LAZ) tickbox writes .laz.
  • _common.build_point_cloud now picks INT / BOOLEAN / FLOAT attribute types based on the numpy dtype of each extras array, instead of forcing every scalar to FLOAT.

Changed

  • All three importers (E57, PLY, LAS/LAZ) gained an Auto Point Radius toggle, on by default. When enabled, the radius is picked from the cloud's bounding box and point density instead of using the manual field. Without this, large LiDAR clouds (kilometre-scale extents) were invisible because the default 5 cm radius was sub-pixel against the scene. The manual Point Radius field is greyed out when Auto is on.
  • suggest_radius moved from ui/panel.py to formats/_common.py so importers and the sidebar's Auto button share one implementation.

v0.2.0 — PLY import and export

Choose a tag to compare

@studiomedio studiomedio released this 28 May 08:31

Added

  • PLY import via File > Import > PLY Point Cloud (.ply).
    • Reads positions, colors (auto-detects 0–255 vs 0–1 ranges), normals, and any other per-vertex scalar properties as point attributes.
    • ASCII and binary little-endian / big-endian formats supported.
    • Pure-Python + numpy parser — no additional bundled wheels.
  • PLY export via File > Export > PLY Point Cloud (.ply).
    • Writes positions, normals, colors (as RGB uint8), and FLOAT / INT / BOOLEAN POINT-domain attributes.
    • ASCII and binary little-endian output.
    • Concatenates multiple selected PointCloud objects into a single PLY file.
  • Internal formats/_common.py module factoring out shared PointCloud build / read helpers used by both E57 and PLY paths.

v0.1.0 — Initial E57 import/export

Choose a tag to compare

@studiomedio studiomedio released this 27 May 22:19

Initial release.

Added

  • E57 import via File > Import > E57 Point Cloud (.e57).
    • Imports positions, colors, normals, and intensity as point attributes.
    • Filters out points flagged by cartesianInvalidState.
    • Optional global scale, initial point radius, and a "Merge Scans" toggle.
    • Auto-generates a Principled BSDF material wired to color or normal attributes.
  • E57 export via File > Export > E57 Point Cloud (.e57).
    • Writes one scan per selected PointCloud object.
    • Optional Apply Modifiers (depsgraph evaluation) and Apply Transforms.
    • Colors written as RGB uint8, intensity as float.
    • Lists non-PointCloud objects that will be skipped before writing.
  • 3D Viewport sidebar panel (N → Point Cloud tab).
    • Shows point count and present attributes.
    • Numeric point-radius field plus a logarithmic slider for smooth scaling across orders of magnitude.
    • Quick magnitude buttons: ÷10 / ÷2 / Auto / ×2 / ×10. The Auto button picks a radius from the cloud's bounding-box diagonal and density.
  • Bundled pye57 0.4.19 and pyquaternion 0.9.9 cp313 wheels for macOS arm64, Linux x86_64, and Windows x86_64.

Known limitations

  • Export does not write normals (pye57's writer has no normal field).
  • Intel Mac (cp313 x86_64) wheels for pye57 are not published on PyPI; that platform is not supported in this release.