Skip to content

Latest commit

 

History

History
241 lines (166 loc) · 17.2 KB

File metadata and controls

241 lines (166 loc) · 17.2 KB

Open3SDCM

An open-source C++ library and CLI tool for converting 3Shape DCM files to standard 3D formats (STL, OBJ, PLY).

Features

The project aims to provide a comprehensive solution for reading and converting 3Shape DCM files:

  1. Read and extract mesh geometry (vertices and triangles) from DCM files - Done
    • Supports schemas CA, CB, CC, and CE (encrypted)
  2. Convert to STL, PLY, OBJ - Done (using Assimp)
  3. 🚧 Read mesh colors - To do
  4. 🚧 Read UV mapping and textures - To do
  5. 🚧 Read extra curves - To do

Not part of the goals (at least initially)

  • Write DCM files
  • Read heavily encrypted files without key

Building from Source

Prerequisites

  • C++20 compatible compiler (GCC 10+, Clang 12+, MSVC 2019+)
  • CMake 3.16 or higher
  • vcpkg (automatically installed by the build system)

The project uses vcpkg to manage dependencies automatically. The following libraries will be installed:

  • Boost (program_options, dynamic_bitset)
  • Poco (XML, Zip)
  • Assimp
  • fmt
  • spdlog
  • OpenSSL

Build Instructions

Linux / macOS

# Clone the repository
git clone https://github.com/yourusername/Open3SDCM.git
cd Open3SDCM

# Configure with CMake (uses vcpkg preset)
cmake --preset ninja-release-vcpkg

# Build
cmake --build builds/ninja-release-vcpkg -j

# The executable will be in: builds/ninja-release-vcpkg/bin/Open3SDCMCLI

Windows

# Clone the repository
git clone https://github.com/yourusername/Open3SDCM.git
cd Open3SDCM

# Configure with CMake
cmake --preset ninja-release-vcpkg

# Build
cmake --build builds/ninja-release-vcpkg --config Release

# The executable will be in: builds\ninja-release-vcpkg\bin\Open3SDCMCLI.exe

Alternative: Debug Build

For development with debug symbols:

cmake -S . -B cmake-build-debug -DCMAKE_BUILD_TYPE=Debug
cmake --build cmake-build-debug -j

Usage

Command Line Interface

The CLI tool Open3SDCMCLI can convert DCM files in two modes:

Single File Conversion

Convert a single DCM file to your desired format:

# Convert to STL
./Open3SDCMCLI -i input.dcm -o output_directory -f stl

# Convert to PLY
./Open3SDCMCLI -i input.dcm -o output_directory -f ply

# Convert to OBJ
./Open3SDCMCLI -i input.dcm -o output_directory -f obj

Batch Directory Conversion

Convert all DCM files in a directory:

# Convert all DCM files in a directory to STL
./Open3SDCMCLI -i input_directory -o output_directory -f stl

# Convert all DCM files to PLY
./Open3SDCMCLI -i input_directory -o output_directory -f ply

Examples

# Example 1: Convert a single scan to STL
./Open3SDCMCLI -i TestData/Handle/HandleAngledLarge.dcm -o ./output -f stl

# Example 2: Convert all DCM files in a folder to PLY
./Open3SDCMCLI -i TestData/Scan-01 -o ./output -f ply

# Example 3: Convert with full paths
./Open3SDCMCLI -i /path/to/scan.dcm -o /path/to/output -f obj

# Display help
./Open3SDCMCLI --help

Command-line Options

  • -i, --input <path> : Input DCM file or directory containing DCM files (required)
  • -o, --output_dir <path> : Output directory for converted files (required)
  • -f, --format <format> : Output format: stl, ply, or obj (default: stl)
  • -h, --help : Display help message

Output

The tool creates a timestamped subdirectory in the output directory (e.g., 2025-02-01-14-30-45/) containing the converted files. The output filename preserves the original DCM filename with the new extension.

Technical Documentation

DCM File Format

DCM files are XML-based files containing 3D scan data. The internal format is called HPS (Himsa Packed Scan). Key components:

  • Vertices: Base64-encoded binary data (floats, 12 bytes per vertex)
  • Facets: Base64-encoded compressed triangle data
  • Schema: Indicates encoding type (CA, CB, CC, CE)
    • CE schema uses Blowfish encryption

Example DCM structure:

<HPS version="1.0">
  <Packed_geometry>
    <Schema>CE</Schema>
    <Binary_data>
      <CE version="1.0">
        <Vertices vertex_count="376" base64_encoded_bytes="4512">...</Vertices>
        <Facets facet_count="748" base64_encoded_bytes="778">...</Facets>
      </CE>
    </Binary_data>
  </Packed_geometry>
</HPS>

For detailed format documentation, see:

Releases

Creating a Release

Method 1: Create a Git Tag (Automated)

  1. Update the version in the VERSION file
  2. Commit your changes
  3. Create and push a tag:
git tag v0.1.1
git push origin v0.1.1

The GitHub Actions workflow will automatically build binaries for Linux, macOS, and Windows and create a release.

Method 2: Manual Workflow Dispatch

You can trigger a release build without creating a tag:

  1. Go to the "Actions" tab on GitHub
  2. Select the "Release" workflow
  3. Click "Run workflow"
  4. Enter the version (e.g., v0.1.1)
  5. Click "Run workflow"

This is useful for testing or rebuilding a release without creating a new tag.

Version Management

The project version is managed in the VERSION file at the repository root. This version is automatically read by CMake and used for all subprojects (CLI, Lib, TestTools).

Reading a DCM file (reverse engineering Documentation)

DCM can be read with a text editor. It is a xml file. The internal file is called HPS. The leaves of the XML contain binary data that is encoded in base64. Thus vertices coordinates and triangles are encoded in base64.

<HPS version="1.0">
  <Packed_geometry>
    <Schema>CE</Schema>
    <Binary_data>
      <CE version="1.0">
        <Vertices vertex_count="376" base64_encoded_bytes="4512" check_value="330137282">Vy8uWErQoyGGm2JWrkMviYSPaR14kSSA8RP9/+fqzSt9YkPCpp4PwNVjyQT08YmaN4HKWti7hsJzjScb0XWEYxAZb86HQDaNspD0AzvKa1Oe5IhmfYK3be13YmsNy933qSuo/Czx/NCkVINNG21jC57wqwhvdrRwkY5LrRQS8WzpaA92k9xNZF1WnnLZagIrNtv+D5TC649Hh6dkcujohL9Ujxf0+eCDdjXn476F9rF2Xqi8mVqKryVJFJkSWkV0Ps8NESmT5w1+ldKLx4Vq9I6WYdzqOBE/lW4SBcbJK2ORk7v6JRoBIk5+GNPsyuClX/hHdOqpiZqalqn4sFOc/ZR+Icg/SPmzMfy2NBGaW0Lr4i1JMKRG9NJRfxtSVaywGyBMdpS5btpZlHi3kn1OanGv35/1N61qC4sxjPEehTw2o52sRcQIn6hdWe1icZgVMj3Uc10IikUZVpNAtr5c2M+auG1OnhbzaPpZeuh41mNg0rkPBKAneZ7wqwhvdrRwdpIFEe5FwDHsvSg/5deJ/7AkQixrf0VKn0B6VtgKwx8bK27nh0eV5nL4f4t12wzJ8IMqe9cJAfGjo8dq7L65YHcLObqm/3J54RrP1vG/eK8UUMgTYt26+o+ZROFfV2XPUf8LrzLnrtj6mXN4F68nK+XnYEAsCLaI+oSQ69DzreaY5ih70ggIoVMlrjdsPemTsIInGwi3n71F+/NASEB7IaWeeXn6NQLJVKRhgrTwVr8tf72O/esqsPoXU0g3deDRONtN1H0B35D62lhDQyGDpZTiiPVdi4kNkd4ijqh+FbmRptTN8gzX1MQGUuk1yoIGV14PapB2PAgeeDSdPocIT9JRfxtSVaywNEe5J2/af3kz0wVm+mEE3VMY/8SWJurLPSW0YV+7idv+Vvx8mdlGOrDfUfeGKGMlAzX7BDhtm2zDs6nL5dzsFCO1eSIJhi2qdJarwHFY51/yNs/M8497CPEXyNJtd91X71cDlq/pop9MjpL6snyJyiusm2dP+a0CNrVPVIsZYGrFTaTB4udc7l2V3PcfV+HZI6wZ2EAuZFoH9B+5QRmVyNqOk2LbOx2O5sbJXz2NoY1F+/NASEB7IcVTr/lp+xaXfJwS1D7bZ0/9DQtaF05dEkaX5OVaGaqvVCsNhUzEvyVQaxXCPWkAfs3idIZV21s3+Kz5GOKu2wjjxuqgzzHGvA25JivcNqJbn6j5OHYk39Pf+7WzjEtijCpnjhbn0IAPMvsnRYBiq2nYVTPw8EojFgTy6qon+8bj/WwYp9V0bgXM60NrMIdjN+ddCBTPnfuelxUnYeiXfuJzOQe0OtdrqMG3XpjsCMCWY8QvNxQ6BtRzOQe0OtdrqKmMjcgvJrKjbedJgN2Sg+G3JA+m1ug5rBPJZ9zqcO13U30eop4zynsJ8FIS5QCIz2LmixSENSdV85iKVW3byELD6lyukkstp2P0az2qTqpw1oBCG4Kaq6SGfVHMpBOeYdUZHPQ2SGja9leD6JAf9kyMP3LTQXOQHYf0zlMiaCjJpgbXlZgJ8g7KLPsLTDAAjdBNgP7CnoVvNl5mqwED+FRtAM0eXz1ZPOqSuHZgJ9G0B03qV4uhlKCVDDubWPwUb3ki7iguXE8UVlpjRgzpnS3cryIURE8Op9oZxtpMRqgovmceNRdcwwXaYYbOcvBC0uwIrzGq+KOvO/kzeCb+in1clZClizpYhBwJPBCzA3WcC0Un5XWYcYDYVTPw8EojFlMlrjdsPemTF72N5DY9s4KzSO9Tsn6L7oXU4lh8zhPr2IUJKh8nVn0ESgOTxLZCNewXNbdf4qgjxr+oVyddOxMESgOTxLZCNTLBpb5jmrWQqpoUfGUv7BTb2OG46s2TuHbo5jU018+LHdteGzGBi69IK88BMbEv3F4ka9sfI3WY5F9Km/fyWF/hWfXeDDy+GraZbBC603MdA0UZgX3NHXKool/ud2w1ZBp/w3anORu4oZrmNAsJETgnzzaJ6W/PGhiQZUuld+MCTSaU7dMBs4OE058xgOVAnzXXzuovctAlN6gED/0ro9DzsbEcCWlxbtrYcit6mKzCudYReeBE1+mHP2SVB11uj4FOGm4Ky1UkBN0Tmy/fzleEBvRlcyy7edivPmwAsejEonGWfBaJuW74RoA2YFuebCVufJZBHL3aXKhmn5cNXdbnNikIMtsnKkeeKKJ1+YB0L9/uvVvx2kvPhLJ2S8KBjiOrHIheJm0AgmKNd70tUpJclZClizpYhFmWr2Mk1JVmc6xVUPlw7lYnrOIg7duqldqOk2LbOx2OxfmEdj/eiIPhGWsr7mJxUdTnyGmOkyCJ60fPfmZ0WX1C+5TsCQTLDoNkR+7GORAQlxUnYeiXfuKP3Gtycjm1w/5I36pGTkwhY8QvNxQ6BtSP3Gtycjm1w1rp1Sx4zpPzbedJgN2Sg+EHTRexb+NN0oPxr73MoKXtbpNGuZ7rkajOEdrUdMQeFQ5aj3+c1uErLJf9JgRKaNlHSWzn+tPAPB9vug8zzPsveqWjdUFFxHk4dhfdP3+Bru+xoXe6LfIDFYIpLvGmz50lzyLywk+Qyr4tnJ+ZEVqVexYBWe5yCMEgOnEg9cXt43O3c9uqxtd8+cogao8ipZLK5S7PPlcwFgBF3MxAJVNG3hRvcGzcJ2rKE+NHqX40bC+1yvsBvo872PKOAq5pNds/uxn1K7ecw8i6at54Ang8zWjFKH/QZpIzU/tnecyIQiiUZznrV2Jc4pD61MLVdu5EcfMRhKm9Vp2bm2DnQ3iB/Y6gebiESemtcLGGDRmpS3AGu7B3IHSbtCG8G0cym2lclZClizpYhDYLue5vj2XiuftpLdvM6yknrOIg7duqlcN+SjxY6yiZMZnUm06nmxauppmwdtnAhLkJ2Xf0jgrHiB3vJjF2R/9ft3AHqY+pQ7hitwQDse9z+dUhG/Es2LJQTZWifdKRjuIE2AiCH2GbWPRAJK+tomNQTZWifdKRjrbN4s0x0MIijxiN3V+/zOfi91O0c62l6zxML9tDc3sMI4VrB+q6lEbyhhITUL2z4MU/KVKClFx1QnZR+CBWKsEw8ZA4o9s9qkhCgupL+SDv4+wP4HjjWOXv0OB3V9g6UK5Z/pfPfC2G3+pirG0fc3aA0WxKw+sotyyo83FKYGL5GZCQ5QggbKJKFRHwMjEAzhRQVBzAwtGtxAKZ84/1tahAxowz4HiXH7HEviWFj9fsWXcsq87/NHKQeEb6aQzoxSB0Lsr+9oXbyjsnKc88drjMrvtwmAq++fvnhfNVW+bzf+g56/cYUsS+WSWFdSGOUDUgqN0SK5WqJxUGBQ1Vd7W0WVHgv/Nr+tpAuLpHFu2UczsWGZpiCBBjC26si8gUEnfti1186YY6GbPDYNMr4JTvx6JM2rSPsmi4j3PPptt50BXjeqQvp1OCh3xdYu351j5TObZfKHDw58gD3Aneb5opKeiCOpamS9BNgP7CnoVvSEgGOj7TLOQyNNdH6HLAhVuBhhGbwt1ObbUdXyAeHl5hn2OLZ9jHLDFuwCGN6I0DDYXvFd77pK9n39h48AcrnznLU620E26enc/eIwvqdOIYrgcre5b9q0ElARQUQb2nUQQ3QIZFtI0Yrgcre5b9q1GKFFlxVmqEvE+u8RZEA6Ha3ALw9WlUUYJpsq1/eTZ9meU+SrxxR9XhqsmZdqTxHtBxAlFdypeobgAUi6xwNoenLOtqzzyb2jdrXsntXJAvIgL6pSWWZPujqI0NhlEuwrva4cDYm107R2xhtd8j5xKjMLCYC7jfV+NFaBZ+CcTjNxEfxJerRyb4OVZrpcGTrlHSqksaO0B6zKcBrkF+MIUV+oxFYR3c5k/O4Nvtkjm/lP8zVJ73+hI+Ea7hsDlbZ0yz8rl2iGF1ALWAScd2d89iTLUvxXA2rSdlGuFw/ojdFQ701gyY4Io5Z7LkUgXKFsYgay40tiHHO/kzeCb+in0Yl1zGNYKmOenF78RihgGuotibrFhJMRutcLGGDRmpSzLR1jO7wh8WSpD9KTcGRdNvpO9PvUAx1oxzoqMZVSK7lRqq2REOMj5HCM4UTk3L0GdiZ1/hVEuApqQWoiuy6ITIcfKoae2ZuObh3kpFh3K3VEMhFI6lLI66fzQH9BsemCd6XcqB7wrGfp+AFb6p0wgiGxLNiAY+ubAOVzVDGN08mzK9Cw6ge10V5xkLbou1sVSSp3KpsqkLgGThsc5Gk4o7+9oeQHeDRHfZ5/34CkW1QAyPyB6xxxleBItlIiaOmi76Rta+2SbZ6PSH59l8ZaxihHYdaCYw122Py4S8b0CccbKb0eS3NIh166vBm7RBYbgTuV8+LmlAFnQB64zaIVgSujBX/lorFC53yZ7WIVrRp2JAoj5eLXMDSiEnkQLytZYUkvygPUpxcopTP3GJ4nyX6MbdAgrIRs/o6+GPa7qtUkSr8YdeIQfIYKhl6OgS7mLB5JOO9t2szw57fp8M9U5crYFT3p8+Rs1uc7Ij+CV30BXjeqQvp1Pvx6JM2rSPsoU5WnYNbzbZPVk/D0myfWB/FESU1HwN4BN9hK9OQ1elegd9sMc+JeFWS4YrvhN7DrCYggEa81pnicntHupAgjtqPsL7jrDdFu0J2WcHpOIqJRx1DOO4qDOA99vhmLq3NQkGmXuEoqs3MK/SKKo0Ncklm0BjzQcSgRzvzZ0hew9moj/pSmwyfPhN8RLSHgUSDVfVf2Yg/mPuLRv1hgXKMhnu8gYs58zR9zev1ykIURowfs4u4mV2WsYjAdy2541IgapRgNqRovW0DqtuCczkMSX/31QhcT+Sfr9nHGyk9IL3HsZix3h2mhNM6oH2+BNXcbxqgbX/Ybw+Zstd2S9F7XrvtdwJ5wybehFgUWWtek+rVXb7KFvaHbruvyapA7M7m+2nFwfA7CusJOFlXrF28sFcrYFT3p8+Rmz5NlhrtVP/Yb4UDLAx4Wjvx6JM2rSPsubwHdWvonhB08wipKy0niBgC32FDNDtXZTeC5aNX5WAjvH1aU5qfTyiYFQtF4RNLrCopqfMqi7/dweYbH1G8VMKMlOmnKabJH6kkHAzoDwtgUNnudTW+uM0tKjmMFYpbrkdN63ZPRkD8HDg8WQhIMhSROvftcR/1KauAQFwFX69Ac/EJEzQ4Xk+ypoXRQ2YWOarH828CMIitiWQqyMR2wI2BfHO7C085BncsGtBwgLGSLDzOZv26wJbrm+O8USx5BncsGtBwgLG7WxsOXY1pgPIS08Ln2bFykPDATULmWiG8UdgVYI1T9nP/r3d3wf/HVlhfbqODBlgbFDb3PhgBg5crYFT3p8+RiNfYNaAP4QGPVk/D0myfWA06tfcGPeWIekpwO4b0xGjEH0KeY8WHn+PE+3DOVjaDJ2pwNG5K+2MQ8lzpyAP7xWVPrxyT13aB88saJhAJ6L37ncQk1C6RvKM7lMCX9MVp0I9W9pSTQQlM5O8yWpcuA+ejhsxfp3+CPAiVLNzsgYG9CVqVnZFDOh6WRokevFOITAY9vU/R5IH67NClellm45epaKX6lkxWxCx0A6mqh9hFTlgFZldH3L/YbAJaUY0NEElARQUQb2npj+oPrlZpm6NfHqr/vwGJaXyJeAYyO2SSeL15jK+PcFcrYFT3p8+RvMNYwP5vE9b08wipKy0niAyUkfoGG/nJvQnanhwyEPe9W6PH4mSqRXFVXMDgcJJSsmmWIxrAu7oOFVZTCcEfjJ7gNBzg5QW/IaVTmZeVESyuygOMFZAzsE1ZVAPNGqBn6auAQFwFX691LEUnn+g4/5Jh8xj1JM+2OarH828CMIighCWvYAcA4//YbAJaUY0NFbKfPGZQ/wT3GZz3WqAyuujKJiNFniDLt6ltOWPZN/6EdgkX+I7lkdCp92DlqgOBDnWuFGIoC0cZmDIWDvZxFL/M4HCo+NgFxb+mYYJ71QOgqS1I4346WeC1OhBTUZ3F/J0B0Xm5P0BC9UYfUFCvB/FRZ0Bpw/bxcNl8wsMzg0b</Vertices>
        <Facets facet_count="748" base64_encoded_bytes="778" color="8421504">BAAAAAAAAAAAAAEAAAIAAAIAAAAAAgAAAAIAAAACAAECAAAAAgIAAAACAgAAAAAAAAICAAABAAICAAAAAAICAAECAgAAAQAAAQIAAAAAAgICAAAAAAAAAQACAgAAAAEAAgICAAAAAAACAgIAAQIAAQAAAAACAgIAAAAAAAICAgIAAAAAAAABAAAAAgICAAAAAQACAgICAAAAAAAAAgICAgABAgICAAABAAACAgIAAAAAAAACAgICAgAAAAAAAAABAAAAAgIAAQAAAAEAAgICAgIAAAAAAAAAAgICAgIAAQICAgAAAQAAAQICAgAAAAAAAAACAgICAgIAAAAAAAAAAAEAAAACAgABAAAAAQACAgICAgIAAAABAAAAAAICAgICAgABAgICAAABAQAAAgICAAAAAAAAAAACAgICAgIAAAAAAAAAAAABAAAAAAEAAQIAAAABAAICAgICAgIAAAAAAQAAAAICAgICAgIAAQICAgABAgABAAIAAQIAAAAAAAAAAAACAgICAgIAAAEAAAAAAAAAAQEAAAABAAIAAgIAAgICAgICAgIAAAEAAQAAAQABAgICAgICAAEAAQIAAQIAAAAH6wAAAAEBCQAAAAAAAAAAAQACAgICAAAAAQAAAAAAAAIAAAAAAQECAgACAgICAgICAgABAAAAAQABAAECAgICAgICBwoBAAABCQICAAEAAAEAAgAAAAAAAAEAAAACAgIAAAAAAQAAAAAAAAEAAAICAgACAgICAgICAgIAAQABAQIAAQICAgICAgICAgABAAEAAgAAAAAAAQAAAAIAAQAAAAEAAAAAAAEAAAICAAICAgICAgABAgc9AQAAAQkAAQICAgICAgICAgABAQACAAAAAAAAAAECAAAAAQAAAAABAAACAAICAgICAgABAAEBAgICAgICAgICAAIAAAACAAABAAAAAQAAAAEAAgACAgICAQABAgIAAQICAgICAAIAAgdxAQAAAAEAAQIAAAECAAICCQd2AQAAAQIHdAEAAAEJAgIAAgkBAQEBAQ==</Facets>
      </CE>
    </Binary_data>
  </Packed_geometry>
  <FacetMarks>QAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAA==</FacetMarks>
  <Annotations/>
  <Objects/>
  <Splines/>
  <Properties>
    <Property name="EKID" value="1"/>
  </Properties>
</HPS>

A documentation of the HPS (Himsa Packed Scan) format can be found here

Vertices are in float format (4 bytes per coordinates) thus 12 bytes per vertex.

Useful links