Пример для правильной реализации 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.

0 ответов

Другие вопросы по тегам