Пример для правильной реализации IfcLightSourceGoniometric с xBim
Я работаю над проектом, в котором мне нужно создать светильники в формате Ifc. Светильники, которые я хочу экспортировать, должны иметь точные данные об освещении, которые я хочу предоставить в виде файла кривой распределения света (*. Ldt и *.ies). В настоящее время я использую xBim 4.0.27. Что я уже могу сделать, это создать IfcFlowTerminal, который набирается с помощью IfcLightFixtureType. Этот LightFixtureType связан с IfcFlowTerminal, который набирается с помощью IfcLampType. Теперь у меня проблема в том, что я действительно не знаю, как добавить гониометрическую информацию в терминал Lam FlowTerminal. Вот код, где я все равно попробовал:
public IfcFlowTerminal GetStandardLuminaire(IModel model)
{
var lightSource = GenerateLightSourceGoniometric(model);
var shape = model.Instances.New<IfcShapeRepresentation>(s =>
{
s.ContextOfItems = model.Instances.FirstOrDefault<IfcRepresentationContext>();
s.Items.Add(lightSource);
s.Items.Add(model.Instances.New<IfcBoundingBox>(bb =>
{
bb.Corner = model.Instances.New<IfcCartesianPoint>(point => point.SetXYZ(1000, 1450, 2000));
bb.XDim = 2000;
bb.YDim = 100;
bb.ZDim = 100;
}));
s.RepresentationIdentifier = "Lighting";
s.RepresentationType = "LightSource";
});
var productDefinitionShape = model.Instances.New<IfcProductDefinitionShape>(pds =>
{
pds.Representations.Add(shape);
});
var terminal = model.Instances.New<IfcFlowTerminal>(t =>
{
t.Name = "IfcTerminal";
t.ObjectPlacement = model.Instances.New<IfcLocalPlacement>(p => p.RelativePlacement = GetOriginPlacementForLuminaire(model));
t.Representation = productDefinitionShape;
});
// just adds some grayish surface
AddSurfaceToLuminaire(model, shape);
var lightFixture = model.Instances.New<IfcLightFixtureType>(fixture =>
{
fixture.PredefinedType = IfcLightFixtureTypeEnum.NOTDEFINED;
});
terminal.AddDefiningType(lightFixture);
AddLampToLightFixture(model, lightFixture, dummyLamp);
return terminal;
}
private void AddLampToLightFixture(IIfcFlowTerminal flowTerminal)
{
var lampFlowTerminal = CreateLampTypeFlowTerminal();
var sourcePort = _ifcExportModel.IfcStore.Instances.New<IfcDistributionPort>(port =>
{
port.FlowDirection = IfcFlowDirectionEnum.SOURCE;
});
var sinkPort = _ifcExportModel.IfcStore.Instances.New<IfcDistributionPort>(port =>
{
port.FlowDirection = IfcFlowDirectionEnum.SINK;
});
var distriPortBetweenLightingSourceAndSink = _ifcExportModel.IfcStore.Instances.New<IfcRelConnectsPorts>(portConnection =>
{
portConnection.RelatingPort = sourcePort;
portConnection.RelatedPort = sinkPort;
});
var portConnectionLightFixtureToLightingSource = _ifcExportModel.IfcStore.Instances.New<IfcRelConnectsPortToElement>(
connection =>
{
connection.RelatedElement = flowTerminal as IfcFlowTerminal;
connection.RelatingPort = sourcePort;
});
var portConnectionLampToLightingSink = _ifcExportModel.IfcStore.Instances.New<IfcRelConnectsPortToElement>(
portToElement =>
{
portToElement.RelatedElement = lampFlowTerminal;
portToElement.RelatingPort = sinkPort;
});
}
private IfcLightSourceGoniometric GenerateLightSourceGoniometric(IModel model)
{
var luminaire = model.Instances.New<IfcLightSourceGoniometric>(lum =>
lum.Name = "Generic Luminaire");
luminaire.ColourAppearance = GetWhiteColourSpecification(model);
luminaire.Position = GetOriginPlacementForLuminaire(model);
luminaire.ColourTemperature = 5000;
luminaire.LuminousFlux = 400;
luminaire.LightColour = GetWhiteColourSpecification(model);
luminaire.LightDistributionDataSource = LoadDataSource(model);
luminaire.LightEmissionSource =
IfcLightEmissionSourceEnum.COMPACTFLUORESCENT;
return luminaire;
}
/// This is just some dummy data
private IfcLightIntensityDistribution LoadDataSource(IModel model)
{
return
model.Instances.New<IfcLightIntensityDistribution>(
p =>
{
p.LightDistributionCurve = IfcLightDistributionCurveEnum.TYPE_C;
// Create light distribution data
});
}
Теперь мой вопрос: это правильный способ отображения фотометрических / гониометрических данных в IFC? У кого-нибудь есть пример кода, где это может быть достигнуто? Трудно самому проверить ifc, потому что я не знаю, какой редактор / средство просмотра может правильно отображать эти объекты IfcLightSourceGoniometric.