#python #points #ifc #ifc-open-shell
#python #Очки #ifc #ifc-open-shell
Вопрос:
Я хотел бы найти длину между двумя точками из модели IFC.Это пример IfcWall из модели IFC.
#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. Я не продвинулся дальше.
заранее благодарю вас!
Ответ №1:
Вам нужно проложить свой путь через граф объектов, начиная со стены:
#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, чтобы узнать, как объекты связаны через их атрибуты и как вызываются атрибуты.
В этом конкретном случае может быть легко отследить граф объектов. Сложная часть — это семантическое богатство схемы с множеством типов, которые разделяют одни атрибуты и различаются в других, которые организованы посредством наследования. Например, атрибут Item объекта IfcShapeRepresentation ссылается на объекты типа IfcRepresentationItem, который имеет много подтипов, IfcPolyline является только одним из них. Вам нужно будет проверить, с каким типом вы сталкиваетесь, и только если это IfcPolyline, ваш метод вычисления будет применим — например, если это будет IfcBSplineCurve .
Библиотеки, такие как IfcOpenShell, проделали большую работу, чтобы охватить всю или, по крайней мере, большую часть схемы, особенно геометрию, а также могут вычислять такие показатели, как длина, площадь, объем, если я не ошибаюсь.