首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Xbim为IFC对象创建和操作Table属性?

如何使用Xbim为IFC对象创建和操作Table属性?
EN

Stack Overflow用户
提问于 2020-08-03 13:55:15
回答 1查看 423关注 0票数 1

我正在研究修改数据的基本示例(https://github.com/xBimTeam/XbimEssentials)。我要更改的唯一内容是在下面的代码中,我希望添加一个IfcPropertyTableValue而不是一个IfcPropertySingleValue。

这段代码运行,但是在XbimXplorer中对象的属性下,什么都没有--它是空的。

为了确保示例代码和其他属性类型确实工作,并在属性下面的Xplorer中显示。

代码语言:javascript
复制
 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中显示的其他属性):

代码语言:javascript
复制
// 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#列表):

代码语言:javascript
复制
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.Collection tions.IEnDigable‘。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-03 17:19:53

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

如果您查看Xplorer码,您会发现它只支持SingleValues、ComplexValues和EnumeratedValues。您可能可以使用复杂值作为多个IfcPropertySingleValues的集合作为解决办法。

在输出值的第二个代码示例中,使用IfcPropertyTableValues子句筛选出任何.OfType<IIfcPropertySingleValue>(),这样就不会看到输出。看看SimpleProperties:1/FINAL/HTML/link/ifcsimpleproperty.htm的IFC规范

关于最后一个问题,您正在用错误的语法初始化数组。试着做这样的事情:

代码语言:javascript
复制
var labels = new Ifc4.MeasureResource.IfcText[] { "x", "y" };
p.DefiningValues.AddRange(labels.Cast<IIfcValue>()); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63230788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档