Skip to content

Commit

Permalink
chore: inside pointcloud multi-threading
Browse files Browse the repository at this point in the history
  • Loading branch information
pnodet committed Aug 12, 2023
1 parent 7eda28f commit 48e046a
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 48 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ edition = "2021"
anyhow = "1.0.72"
clap = { version = "4.3.21", features = ["derive"] }
e57 = "0.5.1"
indicatif = "0.17.6"
indicatif = { version = "0.17.6", features = ["rayon"] }
las = "0.8.1"
nalgebra = "0.32.3"
rayon = "1.7.0"
Expand Down
121 changes: 74 additions & 47 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use las::Write;
use nalgebra::{Point3, Quaternion, UnitQuaternion, Vector3};
use rayon::prelude::*;
use std::path::{Path, PathBuf};
use std::sync::Mutex;
use uuid::Uuid;

#[derive(Parser)]
Expand All @@ -35,6 +36,26 @@ fn main() -> Result<()> {

let pointclouds = e57_reader.pointclouds();

let mut progress_bar = ProgressBar::hidden();

if has_progress {
let total_records: u64 = pointclouds.iter().map(|pc| pc.records).sum();
progress_bar = ProgressBar::new(total_records);
progress_bar.set_style(
ProgressStyle::with_template(
"{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {msg} ({eta})",
)
.unwrap()
.with_key(
"eta",
|state: &ProgressState, w: &mut dyn std::fmt::Write| {
write!(w, "{:.1}s", state.eta().as_secs_f64()).unwrap()
},
)
.progress_chars("=>"),
);
}

pointclouds
.par_iter()
.enumerate()
Expand All @@ -43,7 +64,10 @@ fn main() -> Result<()> {
.context("Couldn't create las path.")
{
Ok(p) => p,
Err(_e) => return (),
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
};

let transform = get_transform(&pointcloud);
Expand All @@ -54,64 +78,68 @@ fn main() -> Result<()> {
builder.generating_software = String::from("e57_to_las");
builder.guid = match Uuid::parse_str(&pointcloud.guid.clone()).context("Invalid guid") {
Ok(g) => g,
Err(_e) => return (),
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
};

let header = match builder.into_header() {
Ok(h) => h,
Err(_e) => return (),
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
};

let mut writer = match las::Writer::from_path(&las_path, header) {
let writer = Mutex::new(match las::Writer::from_path(&las_path, header) {
Ok(w) => w,
Err(_e) => return (),
};
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
});

let mut e57_reader =
match E57Reader::from_file(&input_path).context("Failed to open e57 file") {
Ok(r) => r,
Err(_e) => return (),
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
};

let iter = match e57_reader
.pointcloud(&pointcloud)
.context("Unable to get point cloud iterator")
{
Ok(i) => i,
Err(_e) => return (),
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
};

println!("\nSaving pointcloud {} ...", index);

let mut progress_bar = ProgressBar::hidden();

if has_progress {
progress_bar = ProgressBar::new(pointcloud.records);
progress_bar.set_style(
ProgressStyle::with_template(
"{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {msg} ({eta})",
)
.unwrap()
.with_key(
"eta",
|state: &ProgressState, w: &mut dyn std::fmt::Write| {
write!(w, "{:.1}s", state.eta().as_secs_f64()).unwrap()
},
)
.progress_chars("=>"),
);
}
println!("Saving pointcloud {} ...", index);

for p in iter {
let p = match p.context("Unable to read next point") {
Ok(p) => p,
Err(_e) => return (),
let data: Vec<_> = iter.collect();

data.par_iter().for_each(|p| {
let value = match p {
Ok(value) => value,
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
};
let p = match e57::Point::from_values(p, &pointcloud.prototype)
let p = match e57::Point::from_values(value.clone(), &pointcloud.prototype)
.context("Failed to convert raw point to simple point")
{
Ok(p) => p,
Err(_e) => return (),
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
};

if let Some(xyz) = extract_coordinates(&p) {
Expand All @@ -128,28 +156,27 @@ fn main() -> Result<()> {
..Default::default()
};

match writer.write(las_point) {
let mut writer_guard = writer.lock().unwrap();
match writer_guard.write(las_point) {
Ok(_) => (),
Err(_e) => return (),
Err(_e) => return,
};
}

if has_progress {
progress_bar.inc(1);
}
}
progress_bar.inc(1);
});

match writer.close() {
let mut writer_guard = writer.lock().unwrap();
match writer_guard.close() {
Ok(_) => (),
Err(_e) => return (),
Err(e) => {
eprintln!("Error encountered: {}", e);
return ();
}
};

if has_progress {
progress_bar.finish_with_message("Done");
}
});

println!("Finished convertion from e57 to las !");
progress_bar.finish_with_message("Finished convertion from e57 to las !");
Ok(())
}

Expand Down

0 comments on commit 48e046a

Please sign in to comment.