Repository navigation
Releases: studiomedio/blender-point-cloud-io
Releases · studiomedio/blender-point-cloud-io
Release list
v0.6.0 — Choose which attributes get exported
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_numberandnumber_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 Intensityandintensityall resolve to the same channel. Common aliases from other tools are recognised too —Col/rgb/diffuse_colorfor color,reflectance/amplitudefor 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,INTandBOOLEANattributes but silently skipped every other type, so aFLOAT_COLORnamedColor aFLOAT_VECTORnamedNxvanished from the output. Unclaimed vector and color attributes are now written as<name>_x/_y/_zand<name>_r/_g/_bcomponent columns. - Scalar channels accept non-float attributes. Reading an
INTorBOOLEANattribute as intensity used to fill a float buffer throughforeach_getand fail; the value is now converted. Color channels likewise accept 3-componentFLOAT_VECTORandBYTE_COLORattributes, not justFLOAT_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 informats/_attrs.py.
v0.5.2 — Python 3.14 wheel compatibility
Fixed
- Python 3.14 compatibility. The extension previously bundled
cp313wheels 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)".pye57andlazrsnow shipcp314wheels alongside thecp313ones; Blender selects the matching tag at install time. Official Blender 5.1.x builds are unaffected either way.
Changed
lazrsbumped 0.8.1 → 0.8.2. 0.8.1 published nocp313Linux aarch64 wheel; 0.8.2 does, which is what makes LAZ on ARM Linux possible.- Wider platform coverage for LAS/LAZ.
lazrswheels 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
platformsand releases are built withblender --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
pye57publishes 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
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
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.
- Writes the count header followed by
- 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
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
asciiandbinaryDATA modes.binary_compressed(LZF) raises a clear "convert first" error rather than failing silently.
- Reads positions, packed RGB / RGBA (PCL float-packed convention), normals (
- PCD export via
File > Export > PCD Point Cloud (.pcd).- Writes a single unordered cloud (
HEIGHT = 1) withx y z+ optionalnormal_x/y/z, packedrgb, andintensity. - Binary by default; ASCII tickbox for debugging.
- Writes a single unordered cloud (
- 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.
- Plain text with no header; column layout inferred from column count (3 / 4 / 6 / 7 / 9 columns recognised; anything else becomes opaque
- 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 poisonedsuggest_radius(which then returned NaN), so the radius shown in the N-panel was NaN and the cloud rendered invisibly. Triggered most visibly byoffice1.pcdand other organized RGB-D PCDs. suggest_radiusis 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
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
lazrscodec. - 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_offsetcustom 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_cloudnow picks INT / BOOLEAN / FLOAT attribute types based on the numpy dtype of eachextrasarray, 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_radiusmoved fromui/panel.pytoformats/_common.pyso importers and the sidebar's Auto button share one implementation.
v0.2.0 — PLY import and export
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/BOOLEANPOINT-domain attributes. - ASCII and binary little-endian output.
- Concatenates multiple selected PointCloud objects into a single PLY file.
- Writes positions, normals, colors (as RGB uint8), and
- Internal
formats/_common.pymodule factoring out shared PointCloud build / read helpers used by both E57 and PLY paths.
v0.1.0 — Initial E57 import/export
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. TheAutobutton picks a radius from the cloud's bounding-box diagonal and density.
- Bundled
pye570.4.19 andpyquaternion0.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
pye57are not published on PyPI; that platform is not supported in this release.