use ifc_model::EntityId;
use crate::error::StyleResult;
use crate::view::Record;
#[derive(Debug, Clone, Copy)]
pub struct LightIntensityDistribution<'m, 's> {
record: Record<'m, 's>,
}
impl<'m, 's> LightIntensityDistribution<'m, 's> {
pub(crate) fn from_record(record: Record<'m, 's>) -> Self {
Self { record }
}
pub fn light_distribution_curve(&self) -> StyleResult<&'m str> {
self.record.required_enum("LightDistributionCurve")
}
pub fn distribution_data(&self) -> StyleResult<Vec<EntityId>> {
self.record
.required_refs("DistributionData", "IfcLightDistributionData", 1, None)
}
}
#[derive(Debug, Clone, Copy)]
pub struct LightDistributionData<'m, 's> {
record: Record<'m, 's>,
}
impl<'m, 's> LightDistributionData<'m, 's> {
pub(crate) fn from_record(record: Record<'m, 's>) -> Self {
Self { record }
}
pub fn main_plane_angle(&self) -> StyleResult<f64> {
self.record.required_number("MainPlaneAngle")
}
pub fn secondary_plane_angles(&self) -> StyleResult<Vec<f64>> {
self.record.required_numbers("SecondaryPlaneAngle", 1)
}
pub fn luminous_intensities(&self) -> StyleResult<Vec<f64>> {
self.record.required_numbers("LuminousIntensity", 1)
}
pub fn samples(&self) -> StyleResult<Vec<(f64, f64)>> {
let angles = self.secondary_plane_angles()?;
let intensities = self.luminous_intensities()?;
if angles.len() != intensities.len() {
return Err(self.record.mismatched_lists(
"SecondaryPlaneAngle",
angles.len(),
"LuminousIntensity",
intensities.len(),
));
}
Ok(angles.into_iter().zip(intensities).collect())
}
}