IfcOpenShell从IfcWall中查找坐标

2024-09-30 01:36:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从IFC模型中找出两点之间的长度。这是IFC模型中的IfcWall示例

#26322= IFCWALL('3vpWoB_K1EZ8RCaYmNGsB2',#42,'Basiswand:Bestand 08.0:162343',$,'Basiswand:Bestand 08.0:161894',#25861,#26318,'162343',.NOTDEFINED.); 
#26325= IFCPROPERTYSET('3vpWoB_K1EZ8RCcT4NGsB2',#42,'Pset_WallCommon',$,(#787,#788,#848,#25851));
#26327= IFCRELDEFINESBYPROPERTIES('0rDc6OePf5NBrNT2GfJ3hm',#42,$,$,(#26322),#26325);
#26331= IFCCARTESIANPOINT((12.5832056790716,5.54096330043285,0.));
#26333= IFCAXIS2PLACEMENT3D(#26331,#20,#18);
#26334= IFCLOCALPLACEMENT(#140,#26333);
#26335= IFCCARTESIANPOINT((4.24,0.));
#26337= IFCPOLYLINE((#10,#26335));
#26339= IFCSHAPEREPRESENTATION(#102,'Axis','Curve2D',(#26337));

IFCPOLYLINE有两个点(#10=0,0和#26335=4.24,0),我想找出这两个点之间的距离

其他的墙有一段沉积的长度,但这一面墙没有。以下是其他墙的示例:

#730= IFCWALL('1ZwJH$85D3YQG5AK5ER10a',#42,'Basiswand:Bestand 50.0:148105',$,'Basiswand:Bestand 50.0:150882',#701,#726,'148105',.NOTDEFINED.);
#745= IFCQUANTITYLENGTH('Height',$,$,4.99,$);
#746= IFCQUANTITYLENGTH('Length',$,$,16.675,$);

这是我的代码示例:

import ifcopenshell
walls = ifc_file.by_type('IfcWall')
print(len(walls))

import math

p1 = [0.,0.]
p2 = [16.765,0.]
distance = math.sqrt( ((p1[0]-p2[0])**2)+((p1[1]-p2[1])**2) )
print(distance)

为了应用数学公式,我必须从墙中提取p1和p2的坐标。我不会在这里走得更远

提前谢谢你


Tags: 模型import示例p2p1ifcwallsbestand
1条回答
网友
1楼 · 发布于 2024-09-30 01:36:28

您需要从墙开始通过对象图:

#26322 IfcWall.Representation (attribute 7) references #26318
#26318 is not included in your snippet, but likely an IfcProductDefinitionShape

从这里,您可能会找到另一条与代码段中包含的多段线类似的多段线。有关如何到达那里,请参见下文。可能还有另一面墙,由多段线#25337表示。从这里开始,到达多段线,如下所示:

#XXXXX IfcWall.Representation (attribute 7) references #YYYYY likely IfcProductDefinitionShape
#YYYYY IfcProductDefinitionShape.Representations (attribute 4) likely references #26339 (the 2D representation) and a 3D representation
#26339 IfcShapeRepresentation.Items (attribute 4) references #26337
#25337 IfcPolyline.Points (attribute 1) references #10 and #26335

您可以研究IFC specification以了解实体如何通过其属性连接以及如何调用属性

对于这种特殊情况,跟踪对象图可能很容易。困难的部分是模式的语义丰富性,它有多种类型,这些类型共享一些属性,而其他类型则有所不同,这是通过继承来组织的。例如,IfcShapeRepresentation实体的Item属性引用IfcRepresentationItem类型的实体,该实体具有许多子类型,IfcPolyline只是其中之一。您必须检查遇到的类型,并且仅当它是一个IfcPolyline时,您的计算方法才适用-例如,如果它是一个IfcBSplineCurve,则不适用

IfcOpenShell等库已经投入了大量工作来覆盖所有或至少大部分模式,特别是几何体,如果我没有弄错的话,还可以计算长度、面积、体积等度量

相关问题 更多 >

    热门问题