diff --git a/CMakeLists.txt b/CMakeLists.txt index b8b1afe..27e92e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,6 +74,7 @@ target_include_directories(${LIB_NAME} $ $ ${nlohmann_json_SOURCE_DIR}/include + $ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) diff --git a/src/Parser.cpp b/src/Parser.cpp index 761e1f7..58f7c34 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -705,9 +705,9 @@ OpticsParser::ProductData parseIGSDBJson(nlohmann::json const & product_json) auto material = std::make_shared(parseIGSDBJsonUncomposedProduct_v1(product_material)); auto geometry = parseGeometry(subtype, product_geometry); - CompositionInformation compositionInformation{material, geometry}; auto product = parseIGSDBJsonUncomposedProduct_v1(product_json); - product.composition = compositionInformation; + product.materialDefinition = material; + product.geometry = geometry; return product; } diff --git a/src/ProductData.cpp b/src/ProductData.cpp index 1fd3933..273f254 100644 --- a/src/ProductData.cpp +++ b/src/ProductData.cpp @@ -214,3 +214,13 @@ OpticsParser::PerforatedGeometry::PerforatedGeometry(double spacingX, dimensionY(dimensionY), perforationType(perforationType) {} + +OpticsParser::LouveredGeometry::LouveredGeometry(double slat_width, + double slat_thickness, + double slat_spacing, + double slat_angle) : + slatWidth(slat_width), + slatThickness(slat_thickness), + slatSpacing(slat_spacing), + slatAngle(slat_angle) +{} diff --git a/src/ProductData.hpp b/src/ProductData.hpp index fc1e208..18cd95f 100644 --- a/src/ProductData.hpp +++ b/src/ProductData.hpp @@ -117,6 +117,19 @@ namespace OpticsParser std::string perforationType; }; + struct LouveredGeometry : ProductGeometry + { + LouveredGeometry(double slat_width, + double slat_thickness, + double slat_spacing, + double slat_angle); + + double slatWidth; + double slatThickness; + double slatSpacing; + double slatAngle; + }; + struct DualBandValues { std::optional solarTransmittanceFront; @@ -160,13 +173,6 @@ namespace OpticsParser using PVPowerProperties = std::map>; - struct ProductData; - struct CompositionInformation - { - std::shared_ptr material; - std::shared_ptr geometry; - }; - struct ProductData : std::enable_shared_from_this { ProductData() = default; @@ -181,48 +187,50 @@ namespace OpticsParser std::string const & manufacturer); std::string name; - std::optional productName; + std::optional productName{std::nullopt}; std::string productType; std::string manufacturer; - std::optional productSubtype; - std::optional nfrcid; - std::optional cgdbShadingLayerId; - std::optional cgdbShadeMaterialId; - std::optional thickness; - std::optional conductivity; - std::optional IRTransmittance; - std::optional frontEmissivity; - std::optional backEmissivity; - std::optional frontEmissivitySource; - std::optional backEmissivitySource; - std::optional material; - std::optional coatingName; - std::optional coatedSide; - std::optional substrateFilename; - std::optional appearance; - std::optional acceptance; - std::optional fileName; - std::optional unitSystem; - std::optional wavelengthUnit; - std::optional, DualBandBSDF>> measurements; - std::optional extrapolation; - std::optional aercID; - std::optional specularity; - std::optional permeabilityFactor; - std::optional igdbChecksum; - std::optional igdbDatabaseVersion; - std::optional cgdbChecksum; - std::optional cgdbDatabaseVersion; - std::optional density; - std::optional youngsModulus; - std::optional dataFileName; - std::optional opticalOpenness; - std::optional dualBandSpecular; - std::optional dualBandDiffuse; - std::optional precalculatedResults; - std::optional pvPowerProperties; - std::optional thicknessUnit; - std::optional composition; + std::optional productSubtype{std::nullopt}; + std::optional nfrcid{std::nullopt}; + std::optional cgdbShadingLayerId{std::nullopt}; + std::optional cgdbShadeMaterialId{std::nullopt}; + std::optional thickness{std::nullopt}; + std::optional conductivity{std::nullopt}; + std::optional IRTransmittance{std::nullopt}; + std::optional frontEmissivity{std::nullopt}; + std::optional backEmissivity{std::nullopt}; + std::optional frontEmissivitySource{std::nullopt}; + std::optional backEmissivitySource{std::nullopt}; + std::optional material{std::nullopt}; + std::optional coatingName{std::nullopt}; + std::optional coatedSide{std::nullopt}; + std::optional substrateFilename{std::nullopt}; + std::optional appearance{std::nullopt}; + std::optional acceptance{std::nullopt}; + std::optional fileName{std::nullopt}; + std::optional unitSystem{std::nullopt}; + std::optional wavelengthUnit{std::nullopt}; + std::optional, DualBandBSDF>> measurements{std::nullopt}; + std::optional extrapolation{std::nullopt}; + std::optional aercID{std::nullopt}; + std::optional specularity{std::nullopt}; + std::optional permeabilityFactor{std::nullopt}; + std::optional igdbChecksum{std::nullopt}; + std::optional igdbDatabaseVersion{std::nullopt}; + std::optional cgdbChecksum{std::nullopt}; + std::optional cgdbDatabaseVersion{std::nullopt}; + std::optional density{std::nullopt}; + std::optional youngsModulus{std::nullopt}; + std::optional dataFileName{std::nullopt}; + std::optional opticalOpenness{std::nullopt}; + std::optional dualBandSpecular{std::nullopt}; + std::optional dualBandDiffuse{std::nullopt}; + std::optional precalculatedResults{std::nullopt}; + std::optional pvPowerProperties{std::nullopt}; + std::optional thicknessUnit{std::nullopt}; + std::shared_ptr materialDefinition{nullptr}; + std::shared_ptr geometry{nullptr}; + std::optional deviceType{std::nullopt}; }; // Converting to json requires updating and is not currently being diff --git a/src/factories/bsdfxml.cpp b/src/factories/bsdfxml.cpp index 52ec351..c05b2a3 100644 --- a/src/factories/bsdfxml.cpp +++ b/src/factories/bsdfxml.cpp @@ -78,6 +78,30 @@ namespace OpticsParser return result; } + inline std::shared_ptr + createLouveredGeometryIfLouvered(const BSDFData::WindowElement & data, + const ProductData & product) + { + // Check if it is a louvered shutter and if geometry is provided + if(product.deviceType.has_value() + && BSDFData::DeviceTypeFromString(product.deviceType.value()) + == BSDFData::DeviceType::LouveredShutter + && data.optical.layer.geometry.has_value()) + { + // Build the geometry + LouveredGeometry geometry{data.optical.layer.geometry->width.value_or(0), + data.optical.layer.geometry->height.value_or(0), + data.optical.layer.geometry->spacing.value_or(0), + data.optical.layer.geometry->angle.value_or(0)}; + + // Return it in a shared_ptr + return std::make_shared(geometry); + } + + // Otherwise, return null (no geometry) + return nullptr; + } + } // namespace Helper ProductData convert(const BSDFData::WindowElement & data) @@ -96,13 +120,11 @@ namespace OpticsParser product.thicknessUnit = BSDFData::LengthUnitToString(matData.thickness->unit); product.thickness = matData.thickness->value; } - product.frontEmissivity = matData.emissivityFront; product.backEmissivity = matData.emissivityBack; product.IRTransmittance = matData.TIR; product.conductivity = matData.thermalConductivity; - product.permeabilityFactor = matData.permeabilityFactor; if(!product.permeabilityFactor.has_value()) @@ -112,12 +134,16 @@ namespace OpticsParser const auto bsdfs = Helper::convert(data.optical.layer.wavelengthData); - if(bsdfs.count(Helper::Range::Solar) && bsdfs.count(Helper::Range::Visible)) { product.measurements = DualBandBSDF{bsdfs.at(Helper::Range::Solar), bsdfs.at(Helper::Range::Visible)}; } + + product.deviceType = + DeviceTypeToString(matData.deviceType.value_or(BSDFData::DeviceType::Unknown)); + + product.geometry = Helper::createLouveredGeometryIfLouvered(data, product); } return product; diff --git a/test/read_bsdf_xml_file.unit.cpp b/test/read_bsdf_xml_file.unit.cpp index 0c8e924..f3d2250 100644 --- a/test/read_bsdf_xml_file.unit.cpp +++ b/test/read_bsdf_xml_file.unit.cpp @@ -24,6 +24,8 @@ TEST(TestLoadBSDFXMLFromDisk, TestLoad2011SA1) EXPECT_EQ(product.IRTransmittance, 0.10916); EXPECT_EQ(product.frontEmissivity, 0.79626); EXPECT_EQ(product.backEmissivity, 0.79626); + ASSERT_TRUE(product.deviceType.has_value()); + EXPECT_EQ(product.deviceType.value(), "Other"); EXPECT_TRUE(product.measurements.has_value()); EXPECT_TRUE(std::holds_alternative(product.measurements.value())); auto & measurements = std::get(product.measurements.value()); diff --git a/test/read_igsdb_shading_layer_json.unit.cpp b/test/read_igsdb_shading_layer_json.unit.cpp index 34ad299..c7dc4fb 100644 --- a/test/read_igsdb_shading_layer_json.unit.cpp +++ b/test/read_igsdb_shading_layer_json.unit.cpp @@ -28,12 +28,12 @@ TEST(TestLoadIGSDBJSONFromDisk, TestLoadIGSDBVenetianShadingLayerJSON) EXPECT_EQ(product.backEmissivity, std::optional()); EXPECT_EQ(product.measurements.has_value(), false); auto geometry = std::dynamic_pointer_cast( - product.composition.value().geometry); + product.geometry); EXPECT_EQ(geometry->slatWidth, 14.8); EXPECT_EQ(geometry->slatSpacing, 12.7); EXPECT_EQ(geometry->slatCurvature, 33.13057); EXPECT_EQ(geometry->numberSegments, 5); - auto material = product.composition.value().material; + auto material = product.materialDefinition; EXPECT_EQ(material->productName.value(), "White Venetian Blind Slat"); EXPECT_EQ(material->productType, "material"); EXPECT_EQ(material->manufacturer, "Pella"); @@ -77,13 +77,13 @@ TEST(TestLoadIGSDBJSONFromDisk, TestLoadIGSDBPerforatedScreenShadingLayerJSON) EXPECT_EQ(product.backEmissivity, std::optional()); EXPECT_EQ(product.measurements.has_value(), false); auto geometry = std::dynamic_pointer_cast( - product.composition.value().geometry); + product.geometry); EXPECT_EQ(geometry->spacingX, 1.69); EXPECT_EQ(geometry->spacingY, 1.69); EXPECT_EQ(geometry->dimensionX, 0.58); EXPECT_EQ(geometry->dimensionY, 6.35); EXPECT_EQ(geometry->perforationType, "Circular"); - auto material = product.composition.value().material; + auto material = product.materialDefinition; EXPECT_EQ(material->name, "SCRadiantBarrier.txt"); EXPECT_EQ(material->productType, "material"); EXPECT_EQ(material->manufacturer, "Solar Comfort");