use crate::*;
use std::{
fmt,
io::{Error as ioError, Read},
};
use super::byte_reader::*;
pub fn load_psl<IP, P, R>(read: &mut R, ip: &mut IP) -> PslResult<()>
where
IP: IsPushable<P>,
P: IsBuildable3D,
R: Read,
{
{
let mut buffer = [0u8; 4];
read.read_exact(&mut buffer)?;
}
let _version = LittleReader::read_i32(read)?;
{
let mut buffer = [0u8; 128];
read.read_exact(&mut buffer)?;
}
let n_passes = LittleReader::read_i32(read)?;
let _digitizing_vector_flag = LittleReader::read_i32(read)?;
{
let mut buffer = [0u8; 368];
read.read_exact(&mut buffer)?;
}
for _ in 0..n_passes {
let n_lines = LittleReader::read_i32(read)?;
let _scanner_id = LittleReader::read_i32(read)?;
{
let mut buffer = [0u8; 56];
read.read_exact(&mut buffer)?;
}
for _ in 0..n_lines {
let n_points = LittleReader::read_i32(read)?;
{
let mut buffer = [0u8; 12];
read.read_exact(&mut buffer)?;
}
{
let mut buffer = [0u8; 48];
read.read_exact(&mut buffer)?;
}
for _ in 0..n_points {
let x = LittleReader::read_f32(read)?;
let y = LittleReader::read_f32(read)?;
let z = LittleReader::read_f32(read)?;
ip.push(P::new(x as f64, y as f64, z as f64));
}
}
}
Ok(())
}
pub enum PslError {
AccessFile,
}
pub type PslResult<T> = std::result::Result<T, PslError>;
impl fmt::Debug for PslError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::AccessFile => write!(f, "Unable to access file"),
}
}
}
impl fmt::Display for PslError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl From<ioError> for PslError {
fn from(_error: ioError) -> Self {
PslError::AccessFile
}
}