Files
hkuds--cli-anything/cloudcompare/agent-harness/CLOUDCOMPARE.md
T
2026-07-13 12:55:23 +08:00

143 lines
4.1 KiB
Markdown

# CloudCompare CLI Harness — SOP
## Overview
CloudCompare is a 3D point cloud (and triangular mesh) processing software.
It was originally designed for comparison between two 3D point clouds (e.g. laser scanner data).
It supports a full **command-line mode** via the `-SILENT` flag, which this harness wraps.
## Backend
**CloudCompare itself** is the backend. The Python harness constructs valid `-SILENT` command
strings and invokes them as subprocesses. It does NOT reimplement any 3D processing.
```
CloudCompare -SILENT -O input.las -SS SPATIAL 0.05 -C_EXPORT_FMT LAS -NO_TIMESTAMP -SAVE_CLOUDS FILE output.las
```
### Detecting CloudCompare
The `find_cloudcompare()` function tries (in order):
1. Native binary (`CloudCompare` or `cloudcompare` in PATH)
2. Flatpak (`flatpak run org.cloudcompare.CloudCompare`)
3. Snap (`/snap/bin/cloudcompare`)
### Installation (required)
```bash
# Flatpak (recommended for Linux)
flatpak install flathub org.cloudcompare.CloudCompare
# Debian/Ubuntu
sudo apt install cloudcompare
# macOS
brew install --cask cloudcompare
# Windows
# https://cloudcompare.org/release/index.html
```
## Native CLI Mode
CloudCompare's `-SILENT` mode processes commands sequentially:
```
CloudCompare -SILENT [commands...]
```
Key commands used by this harness:
| CC Command | Purpose |
|-----------|---------|
| `-O <file>` | Open/load a file |
| `-SILENT` | Suppress GUI, run headlessly |
| `-SS METHOD PARAM` | Subsample (RANDOM/SPATIAL/OCTREE) |
| `-ROUGH <radius>` | Compute roughness SF |
| `-DENSITY <radius>` | Compute density SF |
| `-CURV TYPE <radius>` | Compute curvature SF |
| `-SOR <k> <std>` | Statistical Outlier Removal |
| `-NOISE ...` | Noise filter |
| `-CROP x:y:z:X:Y:Z` | Crop to bounding box |
| `-MERGE_CLOUDS` | Merge all loaded clouds |
| `-C2C_DIST` | Cloud-to-cloud distance |
| `-C2M_DIST` | Cloud-to-mesh distance |
| `-ICP` | Iterative Closest Point registration |
| `-OCTREE_NORMALS <level>` | Compute normals |
| `-C_EXPORT_FMT <fmt>` | Set cloud output format |
| `-M_EXPORT_FMT <fmt>` | Set mesh output format |
| `-NO_TIMESTAMP` | No timestamp suffix on output files |
| `-SAVE_CLOUDS FILE <path>` | Save to specific file |
| `-SAVE_MESHES FILE <path>` | Save mesh to specific file |
## Data Model
The harness uses JSON project files:
```json
{
"version": "1.0",
"name": "my_survey",
"clouds": [
{"path": "/abs/path/cloud.las", "label": "cloud", ...}
],
"meshes": [...],
"settings": {
"cloud_export_format": "LAS",
"cloud_export_ext": "las"
},
"history": [
{"operation": "subsample", "inputs": [...], "outputs": [...], "params": {...}}
]
}
```
## Supported File Formats
### Point Clouds
| Extension | Format | Notes |
|-----------|--------|-------|
| .bin | BIN | CloudCompare native binary (default) |
| .las / .laz | LAS | LiDAR format (most common) |
| .ply | PLY | Polygon format |
| .pcd | PCD | Point Cloud Data (ROS/PCL) |
| .xyz / .txt / .asc / .csv | ASC | Plain text ASCII |
| .e57 | E57 | LiDAR exchange format |
### Meshes
| Extension | Format |
|-----------|--------|
| .obj | OBJ (Wavefront) |
| .stl | STL |
| .ply | PLY |
| .bin | CloudCompare binary |
## Key Workflows
### Scan Comparison
```bash
cli-anything-cloudcompare project new -o survey.json
cli-anything-cloudcompare -p survey.json cloud add scan_before.las
cli-anything-cloudcompare -p survey.json cloud add scan_after.las
cli-anything-cloudcompare -p survey.json distance c2c --compare 1 --reference 0 -o diff.las
```
### Point Cloud Cleanup Pipeline
```bash
cli-anything-cloudcompare -p project.json cloud filter-sor 0 -o clean.las
cli-anything-cloudcompare -p project.json cloud subsample 0 -o thin.las --method SPATIAL --param 0.02
```
### ICP Registration
```bash
cli-anything-cloudcompare -p project.json transform icp --aligned 1 --reference 0 -o aligned.las
```
## Agent Usage Notes
1. Always use `--json` flag for machine-parseable output
2. Use absolute paths for all file arguments
3. The `--add-to-project` flag adds outputs back to the project for chaining
4. Check `exists: true` in output JSON to verify CloudCompare produced the file
5. `returncode: 0` means CloudCompare exited successfully