From d18bb95c69f13333e3c54fce4eda9ac06d91b855 Mon Sep 17 00:00:00 2001 From: Nicola Loi Date: Wed, 4 Sep 2024 07:28:35 +0200 Subject: [PATCH 1/2] Support lowercase types (i, u, f) when reading PCD files (#6930) --- CHANGELOG.md | 1 + cpp/open3d/io/file_format/FilePCD.cpp | 21 ++++++++++++--------- cpp/open3d/t/io/file_format/FilePCD.cpp | 25 +++++++++++++++---------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 022c41d17fb6..c58729b74da9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ - Split pybind declarations/definitions to avoid C++ types in Python docs (PR #6869) - Fix minimal oriented bounding box of MeshBase derived classes and add new unit tests (PR #6898) - Fix projection of point cloud to Depth/RGBD image if no position attribute is provided (PR #6880) +- Support lowercase types when reading PCD files (PR #6930) ## 0.13 diff --git a/cpp/open3d/io/file_format/FilePCD.cpp b/cpp/open3d/io/file_format/FilePCD.cpp index ce04f2e2d5b5..17aa080cd29b 100644 --- a/cpp/open3d/io/file_format/FilePCD.cpp +++ b/cpp/open3d/io/file_format/FilePCD.cpp @@ -220,7 +220,8 @@ bool ReadPCDHeader(FILE *file, PCDHeader &header) { double UnpackBinaryPCDElement(const char *data_ptr, const char type, const int size) { - if (type == 'I') { + const char type_uppercase = std::toupper(type, std::locale()); + if (type_uppercase == 'I') { if (size == 1) { std::int8_t data; memcpy(&data, data_ptr, sizeof(data)); @@ -236,7 +237,7 @@ double UnpackBinaryPCDElement(const char *data_ptr, } else { return 0.0; } - } else if (type == 'U') { + } else if (type_uppercase == 'U') { if (size == 1) { std::uint8_t data; memcpy(&data, data_ptr, sizeof(data)); @@ -252,7 +253,7 @@ double UnpackBinaryPCDElement(const char *data_ptr, } else { return 0.0; } - } else if (type == 'F') { + } else if (type_uppercase == 'F') { if (size == 4) { float data; memcpy(&data, data_ptr, sizeof(data)); @@ -281,11 +282,12 @@ double UnpackASCIIPCDElement(const char *data_ptr, const char type, const int size) { char *end; - if (type == 'I') { + const char type_uppercase = std::toupper(type, std::locale()); + if (type_uppercase == 'I') { return (double)std::strtol(data_ptr, &end, 0); - } else if (type == 'U') { + } else if (type_uppercase == 'U') { return (double)std::strtoul(data_ptr, &end, 0); - } else if (type == 'F') { + } else if (type_uppercase == 'F') { return std::strtod(data_ptr, &end); } return 0.0; @@ -297,13 +299,14 @@ Eigen::Vector3d UnpackASCIIPCDColor(const char *data_ptr, if (size == 4) { std::uint8_t data[4] = {0, 0, 0, 0}; char *end; - if (type == 'I') { + const char type_uppercase = std::toupper(type, std::locale()); + if (type_uppercase == 'I') { std::int32_t value = std::strtol(data_ptr, &end, 0); memcpy(data, &value, 4); - } else if (type == 'U') { + } else if (type_uppercase == 'U') { std::uint32_t value = std::strtoul(data_ptr, &end, 0); memcpy(data, &value, 4); - } else if (type == 'F') { + } else if (type_uppercase == 'F') { float value = std::strtof(data_ptr, &end); memcpy(data, &value, 4); } diff --git a/cpp/open3d/t/io/file_format/FilePCD.cpp b/cpp/open3d/t/io/file_format/FilePCD.cpp index 4aa229c0d556..2670e133d5a3 100644 --- a/cpp/open3d/t/io/file_format/FilePCD.cpp +++ b/cpp/open3d/t/io/file_format/FilePCD.cpp @@ -89,30 +89,34 @@ struct WriteAttributePtr { }; static core::Dtype GetDtypeFromPCDHeaderField(char type, int size) { - if (type == 'I') { + char type_uppercase = std::toupper(type, std::locale()); + if (type_uppercase == 'I') { if (size == 1) return core::Dtype::Int8; if (size == 2) return core::Dtype::Int16; if (size == 4) return core::Dtype::Int32; if (size == 8) return core::Dtype::Int64; else - utility::LogError("Unsupported data type."); - } else if (type == 'U') { + utility::LogError("Unsupported size {} for data type {}.", size, + type); + } else if (type_uppercase == 'U') { if (size == 1) return core::Dtype::UInt8; if (size == 2) return core::Dtype::UInt16; if (size == 4) return core::Dtype::UInt32; if (size == 8) return core::Dtype::UInt64; else - utility::LogError("Unsupported data type."); - } else if (type == 'F') { + utility::LogError("Unsupported size {} for data type {}.", size, + type); + } else if (type_uppercase == 'F') { if (size == 4) return core::Dtype::Float32; if (size == 8) return core::Dtype::Float64; else - utility::LogError("Unsupported data type."); + utility::LogError("Unsupported size {} for data type {}.", size, + type); } else { - utility::LogError("Unsupported data type."); + utility::LogError("Unsupported data type {}.", type); } } @@ -305,13 +309,14 @@ static void ReadASCIIPCDColorsFromField(ReadAttributePtr &attr, if (field.size == 4) { std::uint8_t data[4] = {0}; char *end; - if (field.type == 'I') { + char type_uppercase = std::toupper(field.type, std::locale()); + if (type_uppercase == 'I') { std::int32_t value = std::strtol(data_ptr, &end, 0); std::memcpy(data, &value, sizeof(std::int32_t)); - } else if (field.type == 'U') { + } else if (type_uppercase == 'U') { std::uint32_t value = std::strtoul(data_ptr, &end, 0); std::memcpy(data, &value, sizeof(std::uint32_t)); - } else if (field.type == 'F') { + } else if (type_uppercase == 'F') { float value = std::strtof(data_ptr, &end); std::memcpy(data, &value, sizeof(float)); } From b2d1f78b971030f460a0bf9b7ec33587fba1d5b0 Mon Sep 17 00:00:00 2001 From: Tim Ohliger Date: Wed, 4 Sep 2024 07:29:32 +0200 Subject: [PATCH 2/2] Updated delocate-fuse to delocate-merge (got removed in delocate>=0.12.0) (#6940) --- .github/workflows/macos.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8d43e10d6083..2aea46eb5964 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -345,11 +345,8 @@ jobs: PYTAG="-cp$(echo ${{ env.python_version }} | tr -d '.')" mkdir universal_wheels pip install delocate - delocate-fuse -v x64_wheels/open3d-*${PYTAG}*.whl arm64_wheels/open3d-*${PYTAG}*.whl - # Normalize file name as delocate-fuse doesn't update it - OLD_WHL_NAME=$(basename x64_wheels/open3d-*${PYTAG}*.whl) - NEW_WHL_NAME=${OLD_WHL_NAME/x86_64/universal2} - mv x64_wheels/${OLD_WHL_NAME} universal_wheels/${NEW_WHL_NAME} + delocate-merge -v -w universal_wheels x64_wheels/open3d-*${PYTAG}*.whl arm64_wheels/open3d-*${PYTAG}*.whl + NEW_WHL_NAME=$(basename universal_wheels/open3d-*${PYTAG}*.whl) echo "PIP_PKG_NAME=$NEW_WHL_NAME" >> $GITHUB_ENV - name: Upload merged wheels