Scan Essentials - section cuts size after moving pointcloud

Just noticed in SU2026, after importing and moving a pointcould, the section planes in the project become really large. I guess related to the translation of the pointcloud? So when doing zoom-extends when a section plane is visible, the project contents become very small. You must make sure to hide the section planes for zoom-extends to work as expected.

This isn’t specific to point clouds. It’s normal behavior. The section plane size is determined by the enxtents of the model at the level of the section plane. If you don’t want the section plane to enlarge with the placement of the point cloud. Group the rest of the model with the section plane and leave the point cloud out of the group.

Not a point cloud but you can see the same sort of thing happens with other entities.


Moving entities.

Adding an entity.

Putting the section plane in a group with part of the whole model.

Thanks for the reply Dave. This is all know to me but its highly impractical to have put everything into a big ‘container’ just because a pointcloud is imported that drives the boundaries ‘insane‘.

Is there geometry in the point cloud that is very far away causing the expansion of the section planes? Can you delete it?

It would be the same if you import anything that is huge. As I wrote before, that’s not specific to point clouds.

As Mike asks, is there anything at a huge distance from the rest of the cloud?

hello, there are problems with point clouds transformation with current (scan essentials) build, and there will be a fix by the end of the year.
for now it is best moving the clouds close to origin within source software before importing them in sketchup.

working with point clouds that are far from world origin, even if you move them or ask them to be moved close to origin upon importing, can lead to many issues, such as loss of definition/cloud density. I’m pretty sure it also affects what you see with section cuts, and I experienced it as well
on the other hand not moving them can lead to clipping and other issues.

I spent much time moving clouds in recap because of that, but the devs are aware of that and are working on it

2 Likes

thanks for the suggestions and replies Bmike, DaveR and Paul,

The pointcloud is cropped and moved with its center of points at the origin in cloud compare. Just a small ‘box’ with points - no stray points. In SU, using TSE, it does show near the origin for a split second and immediately jumps to a far away position.

Good to know its an issue thats being worked on.

i have the same problem with a points cloud cropped with cloud compare

the bug makes it impossible to use the points cloud

i just installed last version of sketchup 2025

same problem the section plane is far away for the points cloud

is there a version of sketchup I could instal that actually works with point clouds?

hello, it does not depend on sketchup version, but scan essentials version. While they’re working on a fix, as said above, the only workaround is not to use the point cloud transformation withing sketchup, but to recenter the cloud before importing it (in cloud compare, recap etc.)

Thank you for precising

I tried to move the points cloud to the origin before saving it


and it worked

the point clouds is close to the origin, and the section plan also
but there is still a problem

the section plan size does not match the points cloud size

It is manageable, though, scan essentials can be used

thank you

Not on a computer to check it out but I believe the section plane depends on your geometry, not your point cloud even though it’ll also automatically cut your point cloud but you also have a dedicated tool, equivalent to bounding box in scan essentials

you are right


if i add a plane on the points cloud, the section plane size adapts top the plane

everything is fine
thank you again

Had another project and moving the PC in CC didn’t work well. Still insane coordinates in SU. A nice workflow to fix this for now is;

  • convert the (cropped) pointcloud in CloudCompare to asc format
  • have an AI (i used Claude) calculate the bounding box of the pointcloud, calculate a translation from the center of the boundingbox to the origin and apply the translation to the xyz values
  • save as asc file again, open in CloudCompare and save as e57 to import in SU.

This works fine. For future use and even more fast, Claude made a python script. Only needs python installed. Just copy the script to the location of the asc file and run from a command line.

"""
center_pointcloud.py
--------------------
Centers an ASC point cloud around the origin by subtracting the bounding box center.
Leaves all non-XYZ columns (R, G, B, intensity, etc.) intact.

Usage:
    python center_pointcloud.py input.asc
    python center_pointcloud.py input.asc -o output.asc
    python center_pointcloud.py input.asc --xy-only        # Don't translate Z
    python center_pointcloud.py input.asc --translation    # Print translation values and exit

Examples:
    python center_pointcloud.py myscan.asc
    python center_pointcloud.py myscan.asc -o myscan_centered.asc --xy-only
"""

import argparse
import os
import sys


def parse_args():
    parser = argparse.ArgumentParser(description="Center a point cloud ASC file around the origin.")
    parser.add_argument("input", help="Input .asc file")
    parser.add_argument("-o", "--output", help="Output file (default: input_centered.asc)")
    parser.add_argument("--xy-only", action="store_true", help="Only translate X and Y, leave Z unchanged")
    parser.add_argument("--translation", action="store_true", help="Print the translation values and exit without writing a file")
    return parser.parse_args()


def compute_bbox(lines):
    min_x = min_y = min_z = float('inf')
    max_x = max_y = max_z = float('-inf')

    for line in lines:
        parts = line.strip().split()
        if len(parts) < 3:
            continue
        try:
            x, y, z = float(parts[0]), float(parts[1]), float(parts[2])
        except ValueError:
            continue
        if x < min_x: min_x = x
        if y < min_y: min_y = y
        if z < min_z: min_z = z
        if x > max_x: max_x = x
        if y > max_y: max_y = y
        if z > max_z: max_z = z

    return min_x, max_x, min_y, max_y, min_z, max_z


def main():
    args = parse_args()

    if not os.path.isfile(args.input):
        print(f"Error: File not found: {args.input}")
        sys.exit(1)

    # Determine output path
    if args.output:
        output_file = args.output
    else:
        base, ext = os.path.splitext(args.input)
        output_file = f"{base}_centered{ext}"

    # Read file
    print(f"Reading: {args.input}")
    with open(args.input, 'r') as f:
        lines = f.readlines()
    print(f"  {len(lines)} lines read")

    # Compute bounding box
    min_x, max_x, min_y, max_y, min_z, max_z = compute_bbox(lines)

    cx = (min_x + max_x) / 2
    cy = (min_y + max_y) / 2
    cz = (min_z + max_z) / 2 if not args.xy_only else 0.0

    print(f"\nBounding box:")
    print(f"  X: {min_x:.5f} to {max_x:.5f}  (range: {max_x - min_x:.5f})")
    print(f"  Y: {min_y:.5f} to {max_y:.5f}  (range: {max_y - min_y:.5f})")
    print(f"  Z: {min_z:.5f} to {max_z:.5f}  (range: {max_z - min_z:.5f})")
    print(f"\nTranslation to apply:")
    print(f"  TX: -{cx:.5f}")
    print(f"  TY: -{cy:.5f}")
    print(f"  TZ: -{cz:.5f}  {'(Z unchanged)' if args.xy_only else ''}")

    if args.translation:
        print("\n--translation flag set: exiting without writing file.")
        sys.exit(0)

    # Apply translation and write output
    print(f"\nWriting: {output_file}")
    with open(output_file, 'w') as f:
        for line in lines:
            parts = line.strip().split()
            if len(parts) < 3:
                f.write(line)
                continue
            try:
                x = float(parts[0]) - cx
                y = float(parts[1]) - cy
                z = float(parts[2]) - cz
            except ValueError:
                f.write(line)
                continue
            rest = ' '.join(parts[3:])
            f.write(f"{x:.8f} {y:.8f} {z:.8f} {rest}\n")

    print(f"Done! {len(lines)} points written.")
    print(f"\nTo undo this translation in your CAD program, apply offset:")
    print(f"  X + {cx:.5f},  Y + {cy:.5f},  Z + {cz:.5f}")


if __name__ == "__main__":
    main()

Are you bringing the point cloud into Layout?

@kevin58 no, never. I use the pointcloud to make models of existing structures

Okay — that’s what I do as well. I use a different plugin to import point clouds into SketchUp called Undet which I’ve found to be absolutely brilliant. You can download a free trial of it here.

Free Trial - register and get Undet for SketchUp | Undet

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.