Как создать свойство Table для объекта IF C и управлять им с помощью Xbim? - PullRequest
0 голосов
/ 03 августа 2020

Я работаю над базовым примером c для изменения данных (https://github.com/xBimTeam/XbimEssentials). Единственное, что я изменяю, - это код ниже, где я хочу добавить IfcPropertyTableValue вместо IfcPropertySingleValue.

Этот код выполняется, но в XbimXplorer в свойствах объекта ничего нет - он пуст.

Чтобы убедиться, что код примера, а также другие типы свойств работают и отображаются в Xplorer в разделе свойств.

 var pSetRel = model.Instances.New<IfcRelDefinesByProperties>(r =>
                                {
                                    r.GlobalId = Guid.NewGuid();
                                    r.RelatingPropertyDefinition = model.Instances.New<IfcPropertySet>(pSet =>
                                    {
                                        pSet.Name = "Points";

                                        // FOR EACH POINT i :
                                        pSet.HasProperties.Add(model.Instances.New<IfcPropertyTableValue>(p =>
                                        {
                                            
                                            p.Name = "Points " + i;
                                            
                                            // FOR EACH COORDINATE x : 
                                            p.DefiningValues.Add(new IfcText(x));
                                            p.DefinedValues.Add(new IfcReal(-3.25));

                                        }));
                                    });
                                });

Как я могу заставить это работать?

Я также пробовал использовать код для чтения свойства на случай, если XbimXplorer просто не отображает таблицы. Этот код запускается и печатает нулевые строки (но работает для других свойств, отображаемых в Xplorer):

// Try to read and print the new property
                    var nameObj = "my_object_name";
                    var checkObj = model.Instances.FirstOrDefault<IIfcBuildingElement>(d => d.Name == nameObj);
                    if (checkObj == null)
                    {
                        outputBox.AppendText(newLine + "Object: " + nameObj + " not found");
                    }
                    else
                    {
                        var properties = checkObj.IsDefinedBy
                            .Where(r => r.RelatingPropertyDefinition is IIfcPropertySet)
                            .SelectMany(r => ((IIfcPropertySet)r.RelatingPropertyDefinition).HasProperties)
                            .OfType<IIfcPropertySingleValue>();
                        foreach (var property in properties)
                            outputBox.AppendText($"Property: {property.Name}, Value: {property.NominalValue}");
                    }

Было бы также удобно, если бы я мог добавить сразу несколько определяющих / определяемых пар значений, например, как это (аналогично обычным спискам C#):

IEnumerable<IfcValue> definingValues = new IfcText() {"x", "y", "z", "k"};
p.DefinedValues.AddRange(definingValues);

IEnumerable<IfcValue> definedValues = new IfcReal() {0.0, 1.6, -2.5, 3.33};
p.DefinedValues.AddRange(definedValues);

Однако {"x", "y", "z", "k"} помечается ошибкой Невозможно инициализировать тип IfcText с помощью инициализатора коллекции, поскольку он не реализует ' System.Collections.IEnumerable '.

1 Ответ

0 голосов
/ 03 августа 2020

Я не думаю, что xbim Xplorer отображает IfcPropertyTableValues ​​. Вероятно, потому что очень немногие инструменты BIM в настоящее время выводят TableValues, поэтому я предполагаю, что это так и не было реализовано (и вам нужно будет установить sh, как отображать таблицу в представлении Xplorer - вы вкладываете таблицу в сетку свойств?) *. 1003 *

Если вы посмотрите на код Xplorer , вы увидите, что он поддерживает только SingleValues, ComplexValues ​​и EnumeratedValues. Возможно, вы сможете использовать комплексные значения как коллекцию из нескольких IfcPropertySingleValues ​​в качестве обходного пути.

Во втором примере кода для вывода значений вы отфильтровываете любые IfcPropertyTableValues ​​с помощью предложения .OfType<IIfcPropertySingleValue>(), чтобы вы никогда не увижу вывода. Взгляните на спецификации IF C для SimpleProperties: https://standards.buildingsmart.org/IFC/RELEASE/IFC4_1/FINAL/HTML/link/ifcsimpleproperty.htm

По последнему вопросу вы инициализируете массив с неправильным синтаксисом. Попробуйте примерно так:

var labels = new Ifc4.MeasureResource.IfcText[] { "x", "y" };
p.DefiningValues.AddRange(labels.Cast<IIfcValue>()); 
...