繁体   English   中英

如何使用 Xbim 创建和操作 IFC object 的表属性?

[英]How do I create and manipulate a Table property for an IFC object using Xbim?

我正在研究修改数据的基本示例( 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"}然后被标记为错误Cannot initialize type 'IfcText' with a collection initializer 因为它没有实现 'System.Collections.IEnumerable'

我不认为 xbim Xplorer 显示IfcPropertyTableValues 可能是因为目前很少有 BIM 工具 output TableValues 所以我猜它从未实现过(并且您需要确定如何在 Xplorer 视图中显示表格 - 您是否在属性网格中嵌套表格?)。

如果您查看Xplorer 代码,您会发现它仅支持 SingleValues、ComplexValues 和 EnumeratedValues。 您也许可以将复杂值用作多个 IfcPropertySingleValues 的集合作为解决方法。

在 output 值的第二个代码示例中,您使用.OfType<IIfcPropertySingleValue>()子句过滤掉任何 IfcPropertyTableValues,因此您永远不会看到 output。 查看 SimpleProperties 的 IFC 规范: 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>()); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM