use ifc_model::EntityId;
use crate::error::StyleResult;
use crate::light::source::LightSource;
use crate::view::Record;
#[derive(Debug, Clone, Copy)]
pub struct LightSourcePositional<'m, 's> {
record: Record<'m, 's>,
}
impl<'m, 's> LightSourcePositional<'m, 's> {
pub(crate) fn from_record(record: Record<'m, 's>) -> Self {
Self { record }
}
pub fn light_source(&self) -> LightSource<'m, 's> {
LightSource::from_record(self.record)
}
pub fn position(&self) -> StyleResult<EntityId> {
self.record.required_ref("Position", "IfcCartesianPoint")
}
pub fn radius(&self) -> StyleResult<f64> {
self.record.positive("Radius", "IfcPositiveLengthMeasure")
}
pub fn constant_attenuation(&self) -> StyleResult<f64> {
self.record.required_number("ConstantAttenuation")
}
pub fn distance_attenuation(&self) -> StyleResult<f64> {
self.record.required_number("DistanceAttenuation")
}
pub fn quadric_attenuation(&self) -> StyleResult<f64> {
self.record.required_number("QuadricAttenuation")
}
}
#[derive(Debug, Clone, Copy)]
pub struct LightSourceSpot<'m, 's> {
record: Record<'m, 's>,
}
impl<'m, 's> LightSourceSpot<'m, 's> {
pub(crate) fn from_record(record: Record<'m, 's>) -> Self {
Self { record }
}
pub fn positional(&self) -> LightSourcePositional<'m, 's> {
LightSourcePositional::from_record(self.record)
}
pub fn light_source(&self) -> LightSource<'m, 's> {
LightSource::from_record(self.record)
}
pub fn orientation(&self) -> StyleResult<EntityId> {
self.record.required_ref("Orientation", "IfcDirection")
}
pub fn concentration_exponent(&self) -> StyleResult<Option<f64>> {
self.record.optional_number("ConcentrationExponent")
}
pub fn spread_angle(&self) -> StyleResult<f64> {
self.record
.positive("SpreadAngle", "IfcPositivePlaneAngleMeasure")
}
pub fn beam_width_angle(&self) -> StyleResult<f64> {
self.record
.positive("BeamWidthAngle", "IfcPositivePlaneAngleMeasure")
}
}