From e1b1940d83ae7144ec4e9094146fb22a55b964b8 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sat, 11 Nov 2017 09:43:45 +0100 Subject: [PATCH] Conversion back from hdf to spf, referenced profile --- src/ifcparse/IfcHdf5File.cpp | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/ifcparse/IfcHdf5File.cpp b/src/ifcparse/IfcHdf5File.cpp index 17be3c1b28..d2efe93783 100644 --- a/src/ifcparse/IfcHdf5File.cpp +++ b/src/ifcparse/IfcHdf5File.cpp @@ -1898,6 +1898,8 @@ public: return inst_name; } + + H5::H5File& file() { return file_; } }; void visit(instance_resolver& resolver, std::ostream& output, void* buffer, H5::DataType* dt, const std::string& name = no_name, const std::bitset<64>& bitmask = many_trues, int padded_length=-1) { @@ -2073,6 +2075,41 @@ void visit(instance_resolver& resolver, std::ostream& output, void* buffer, H5:: } output << ")"; dt2.close(); + } else if (dt->getClass() == H5T_REFERENCE) { + hid_t setid = H5Rdereference(resolver.file().getId(), H5R_DATASET_REGION, buffer); + hid_t spaceid = H5Rget_region(resolver.file().getId(), H5R_DATASET_REGION, buffer); + + H5::DataSet dset(setid); + H5::DataSpace dspace(spaceid); + H5::CompType dtype = dset.getCompType(); + + if (dspace.getSelectNpoints() != 1) { + throw std::runtime_error("Unexpected number of points selected"); + } + + hsize_t selected; + dspace.getSelectElemPointlist(0, 1, &selected); + + hsize_t dims = 1; + H5::DataSpace memspace(1, &dims); + + uint8_t* buffer = new uint8_t[dtype.getSize()]; + dset.read(buffer, dtype, memspace, dspace); + + const int i = dtype.getMemberIndex(Entity_Instance_Identifier); + const size_t offs = dtype.getMemberOffset(i); + H5::DataType instidt = dtype.getMemberDataType(i); + + const int name = read(buffer + offs, &instidt); + output << "#" << name; + + instidt.close(); + dtype.close(); + dspace.close(); + memspace.close(); + dset.close(); + + delete[] buffer; } else { throw std::runtime_error("Unexpected datatype encountered"); }