Извлечение количества элементов с помощью IfcOpenShell в python

Я пытаюсь прочитать самый глубокий уровень количества объектов в файле ifc, используя IfcOpenShell в Python. Пока у меня есть:

import ifcopenshell

path = r'D:\ifcos_1\slab.ifc'
ifc_file = ifcopenshell.open(path)

geometries = ifc_file.by_type("IfcProduct")

for geometry in geometries:
    if geometry.is_a("IfcSlab"):
        print geometry
        test = geometry.IfcPhysicalQuantity()
        print test

Я изучил определения.

Независимо от того, какой тип функции я пытаюсь разместить для test = geometry.X(), я получаю сообщение об ошибке:

File "C:\Python27\lib\site-packages\ifcopenshell\entity_instance.py", line 48, in __getattr__
   "entity instance of type '%s' has no attribute '%s'" % (self.wrapped_data.is_a(), name))
AttributeError: entity instance of type 'IfcSlab' has no attribute 'IfcPhysicalQuantity'

Не уверен, как это решить, и был бы признателен за помощь.

ИЗМЕНИТЬ:

Дальнейшая работа, которая получает плиту и дополнительные ссылки:

for geometry in geometries:
    if geometry.is_a("IfcSlab"):
        print geometry
        definedBy = geometry.IsDefinedBy

        print definedBy[0]

        for each in definedBy:
            test = each.is_a()
            print test

На данный момент препятствием является совместимость с IFC4, которую я попытаюсь перекомпилировать с инструкциями из это сообщение на форуме.

ИЗМЕНИТЬ 2:

Дальнейшая работа с использованием пока стандарта IFC 2x3 с файлом, в котором есть информация о количестве (проверенная с помощью необработанных данных). Ниже приведен соответствующий код:

for geometry in geometries:
    if geometry.is_a("IfcSlab"):
        definedBy = geometry.IsDefinedBy

        for line in definedBy:
        test = line.is_a()
        # print test
        if line.is_a() == 'IfcRelDefinesByProperties' or line.is_a() == 'IfcRelDefinesByType':
            step1 = line.RelatingPropertyDefinition
            step2 = step1.is_a()
            print step2

Возникает ошибка независимо от того, что я ставлю после step1 = line., ничего из следующего не дает результата:

line.IfcPropertySet
line.IfcElementQuantity
line.RelatingPropertyDefiniton

Тем не менее, вывод из этого кода:

IfcPropertySet
IfcPropertySet
IfcPropertySet
IfcPropertySet
IfcPropertySet
IfcPropertySet
IfcPropertySet
IfcPropertySet
IfcPropertySet
IfcPropertySet
IfcElementQuantity
IfcElementQuantity

Это означает, что я могу получить доступ к IfcElementQuantity, но ни один из атрибутов не работает. Я просмотрел справку по схеме, но не могу найти правильный.


person Yafim Simanovsky    schedule 24.05.2018    source источник


Ответы (2)


При реализации этого вы должны позаботиться о том, с какой версией IFC работает ваша библиотека импорта - версия, распространяемая веб-сайтом IfcOpenShell, работает с IFC2X3. Для IFC4 вам, вероятно, потребуется скомпилировать версию самостоятельно. (вы можете проверить свою версию IFC с помощью ifcopenshell.schema_identifier)

Я размещаю ссылки на определение BuildingSMART IFC 4, даже если я говорю об IFC2X3. Отличия от IFC2X3 отмечены красным на веб-странице buildingSMART. И определение IFC4 приятнее читать (IMO).

Количество не присоединено напрямую, как атрибут. Они записываются в виде наборов свойств, а затем связаны с элементом или типом элемента. Поэтому сначала вы должны убедиться, что ваш файл IFC содержит количества, иначе вы ничего не найдете. Обычно вы начинаете с определенного продукта - ifc_file.by_type('IfcSlab'). Вы можете получить доступ к наборам свойств через обратные атрибуты — они обычно устанавливаются библиотекой IFC, они не отображаются непосредственно как атрибуты в файле.

Я взял ваш файл примера и сократил его примерно до трети (так что это все еще действительный файл IFC2X3):

ISO-10303-21;
HEADER;FILE_DESCRIPTION(('ViewDefinition [Custom, QuantityTakeOffAddOnView, SpaceBoundary2ndLevelAddOnView]','Option [Drawing Scale: 100.000000]','Option [Global Unique Identifiers (GUID): Keep existing]','Option [Elements to export: Visible elements (on all stories)]','Option [Partial Structure Display: Entire Model]','Option [IFC Domain: All]','Option [Structural Function: All Elements]','Option [Convert Grid elements: On]','Option [Convert IFC Annotations and ARCHICAD 2D elements: Off]','Option [Convert 2D symbols of Doors and Windows: Off]','Option [Explode Composite and Complex Profile elements into parts: On]','Option [Export geometries that Participates in Collision Detection only: Off]','Option [Elements in Solid Element Operations: Extruded/revolved]','Option [Elements with junctions: Extruded/revolved without junctions]','Option [Slabs with slanted edge(s): Extruded]','Option [Use legacy geometric methods as in Coordination View 1.0: Off]','Option [IFC Site Geometry: As boundary representation (BRep)]','Option [IFC Site Location: At Project Origin]','Option [Curtain Wall export mode: Container Element]','Option [Railing export mode: Single Element]','Option [Stair export mode: Container Element]','Option [Properties To Export: All properties]','Option [Space containment: On]','Option [IFC Domain For Space Containment: All]','Option [Bounding Box: Off]','Option [Geometry to type objects: Off]','Option [Element Properties: All]','Option [Property Type Element Parameter: On]','Option [Quantity Type Element Parameter: On]','Option [IFC Base Quantities: On]','Option [Window Door Lining and Panel Parameters: On]','Option [IFC Space boundaries: On]','Option [ARCHICAD Zone Categories as IFC Space classification data: On]','Option [Element Classifications: On]'),'2;1');
FILE_NAME('D:\\Side Projects\\Paragraph3\\The database\\IFC Files\\Local tests\\ifcos_1\\slab.ifc','2018-06-13T18:28:40',('Architect'),('Building Designer Office'),'The EXPRESS Data Manager Version 5.02.0100.09 : 26 Sep 2013','IFC file generated by GRAPHISOFT ARCHICAD-64 21.0.0 INT FULL Windows version (IFC2x3 add-on version: 3005 INT FULL).','The authorising person');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
#1= IFCPERSON($,'Undefined',$,$,$,$,$,$);
#7= IFCPERSONANDORGANIZATION(#1,#10,$);
#10= IFCORGANIZATION('GS','GRAPHISOFT','GRAPHISOFT',$,$);
#11= IFCAPPLICATION(#10,'21.0.0','ARCHICAD-64','IFC2x3 add-on version: 3005 INT FULL');
#12= IFCOWNERHISTORY(#7,#11,$,.ADDED.,$,$,$,1528907320);
#13= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
#14= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#16= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17= IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.0174532925199),#16);
#18= IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#19= IFCCONVERSIONBASEDUNIT(#18,.PLANEANGLEUNIT.,'DEGREE',#17);
#29= IFCUNITASSIGNMENT((#13,#14,#19));
#31= IFCDIRECTION((1.,0.,0.));
#35= IFCDIRECTION((0.,0.,1.));
#37= IFCCARTESIANPOINT((0.,0.,0.));
#39= IFCAXIS2PLACEMENT3D(#37,#35,#31);
#40= IFCDIRECTION((0.,1.));
#42= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.00000000000E-5,#39,#40);
#45= IFCPROJECT('344O7vICcwH8qAEnwJDjSU',#12,'Project',$,$,$,$,(#42),#29);
#59= IFCLOCALPLACEMENT($,#39);
#62= IFCSITE('20FpTZCqJy2vhVJYtjuIce',#12,'Site',$,$,#59,$,$,.ELEMENT.,(47,33,34,948800),(19,3,17,204400),0.,$,$);
#68= IFCRELAGGREGATES('0Du7$nzQXCktKlPUTLFSAT',#12,$,$,#45,(#62));
#74= IFCQUANTITYLENGTH('GrossPerimeter',$,$,0.);
#76= IFCQUANTITYAREA('GrossArea',$,$,0.);
#77= IFCELEMENTQUANTITY('2GNZepdf73fvGc$0W6rozj',#12,'BaseQuantities',$,'ARCHICAD BIM Base Quantities',(#74,#76));
#82= IFCRELDEFINESBYPROPERTIES('2Hm9JvZjohDNSD2kdxZI3b',#12,$,$,(#62),#77);
#93= IFCLOCALPLACEMENT(#59,#39);
#95= IFCBUILDING('00tMo7QcxqWdIGvc4sMN2A',#12,'Building',$,$,#93,$,$,.ELEMENT.,$,$,$);
#97= IFCRELAGGREGATES('2b_h_mYcGArd6glJG2Fmbt',#12,$,$,#62,(#95));
#101= IFCQUANTITYAREA('GrossFloorArea',$,$,0.);
#102= IFCELEMENTQUANTITY('1kQMlmT0rD35a9E43iKTas',#12,'BaseQuantities',$,'ARCHICAD BIM Base Quantities',(#101));
#104= IFCRELDEFINESBYPROPERTIES('0L87OdSD3DqSTjSRlAciZL',#12,$,$,(#95),#102);
#115= IFCLOCALPLACEMENT(#93,#39);
#117= IFCBUILDINGSTOREY('1oZ0wPs_PE8ANCPg3bIs4j',#12,'Ground Floor',$,$,#115,$,$,.ELEMENT.,0.);
#119= IFCRELAGGREGATES('118jwqMnuwK1xuf97w7fU5',#12,$,$,#95,(#117));
#180= IFCSLAB('3W29Drc$H6CxK3FGIxjJNl',#12,'SLA - 001',$,$,$,$,'E0089375-9BF4-4633-B503-3D04BBB535EF',.FLOOR.);
#195= IFCRELCONTAINEDINSPATIALSTRUCTURE('04ldtj6cp2dME6CiP80Bzh',#12,$,$,(#180),#117);
#326= IFCPROPERTYSINGLEVALUE('Fragility rating',$,IFCLABEL('0'),$);
#327= IFCPROPERTYSINGLEVALUE('Tile dimensions',$,IFCLABEL('Undefined'),$);
#328= IFCPROPERTYSINGLEVALUE('Anti-static Surface',$,IFCBOOLEAN(.F.),$);
#329= IFCPROPERTYSINGLEVALUE('Non-skid Surface',$,IFCBOOLEAN(.F.),$);
#330= IFCPROPERTYSET('0LYX8AqOOS9ft8M4aJYEYa',#12,'FLOORINGS',$,(#326,#327,#328,#329));
#332= IFCRELDEFINESBYPROPERTIES('1G6WWCSQGg0PdTnW7hwMrM',#12,$,$,(#180),#330);
#335= IFCPROPERTYSINGLEVALUE('Renovation Status',$,IFCLABEL('Existing'),$);
#336= IFCPROPERTYSET('0cR6wsk2QWcLKPchA8mF3u',#12,'AC_Pset_RenovationAndPhasing',$,(#335));
#338= IFCRELDEFINESBYPROPERTIES('3nYD8KGPhoBw5okmj1JjsA',#12,$,$,(#180),#336);
#341= IFCQUANTITYLENGTH('Width',$,$,300.);
#342= IFCQUANTITYLENGTH('Perimeter',$,$,22000.);
#343= IFCQUANTITYAREA('GrossArea',$,$,28.);
#344= IFCQUANTITYAREA('NetArea',$,$,28.);
#345= IFCQUANTITYVOLUME('GrossVolume',$,$,8.4);
#346= IFCQUANTITYVOLUME('NetVolume',$,$,8.4);
#347= IFCELEMENTQUANTITY('1RfXJewSc7OCIaD$L2ZoXT',#12,'BaseQuantities',$,'ARCHICAD BIM Base Quantities',(#341,#342,#343,#344,#345,#346));
#349= IFCRELDEFINESBYPROPERTIES('085uLttAQRllG3nL_YikZ8',#12,$,$,(#180),#347);
#375= IFCQUANTITYVOLUME('Gross Volume of the Slab',$,$,8.4);
#376= IFCQUANTITYVOLUME('Gross Volume of the Slab with Holes',$,$,8.4);
#377= IFCQUANTITYLENGTH('Holes Perimeter',$,$,0.);
#378= IFCQUANTITYAREA('Holes Surface Area',$,$,0.);
#379= IFCQUANTITYLENGTH('Perimeter',$,$,22000.);
#381= IFCQUANTITYAREA('Top Surface Area',$,$,28.);
#382= IFCELEMENTQUANTITY('0DuZ12CVtssgcIQPaQ$1sp',#12,'ArchiCADQuantities',$,'ARCHICAD BIM Quantities',(#375,#376,#377,#378,#379,#381));
#384= IFCRELDEFINESBYPROPERTIES('0KgGv0Y8Fc2jg8BCPhxnM5',#12,$,$,(#180),#382);
#393= IFCSLABTYPE('0K1otpnkQcEpOBXPxnZ3dB',#12,'Timber - Floor 300',$,$,(#396),$,'14072DF3-C6E6-A63B-360B-859EF18C39CB',$,.FLOOR.);
#395= IFCRELDEFINESBYTYPE('353egCMRpZtJd$CDCoSsCb',#12,$,$,(#180),#393);
#352= IFCQUANTITYAREA('Area',$,$,28.);
#353= IFCQUANTITYLENGTH('Height',$,$,300.);
#354= IFCQUANTITYVOLUME('Net Volume',$,$,8.4);
#396= IFCELEMENTQUANTITY('1Zyxf4r7NogSp4V7ORMpET',#12,'ArchiCADQuantities',$,'ARCHICAD BIM Quantities',(#352,#353,#354));
ENDSEC;
END-ISO-10303-21;

Это плита с прикрепленным измерением площади. Он должен иметь обратный атрибут IsDefinedBy. В IFC2X3 это указывает на список объектов IfcRelDefinesByProperties и IfcRelDefinesByType. В IFC4 IfcRelDefinesByType будет помещен в обратный атрибут IsTypedBy.

Каждый IfcRelDefinesByProperties указывает на набор свойств в их атрибуте RelatingPropertyDefinition. Существуют различные типы наборов свойств, вы хотите, чтобы они были типа IfcElementQuantity при поиске физических величин. Вам нужно будет проверить во время выполнения, какой тип вы в настоящее время имеете при повторении списка отношений свойств.

Набор количества содержит список IfcPhysicalQuantities. прикреплен в атрибуте Quantities. Это могут быть простые величины или сложные величины, состоящие из нескольких простых величин. Для простых величин существуют специальные подтипы для площади, количества или веса. Опять же, вам придется проверять конкретный тип во время выполнения.

Сама величина площади имеет имя и описание для дополнительного контекста (не нашего, но, возможно, реального мира). Атрибут значения назван в честь типа количества, поэтому IfcQuantityArea имеет атрибут AreaValue. Также представляет интерес атрибут Unit, который является ссылкой на единицу измерения значения. Если он не установлен (как в нашем примере), вам нужно будет искать назначенные единицы в объекте IfcProject.

К сожалению, это может быть не все. Если объект (здесь наш IfcSlab) имеет назначенный тип объекта, этот тип также может иметь прикрепленные наборы свойств (я изменил пример файла для этого случая). Сущность вашего типа имеет не обратный атрибут, а прямой, HasProperties. Если он установлен, через него можно обнаружить прикрепленные свойства.

Подводя итог, вам, вероятно, понадобится несколько циклов:

  1. Для каждого объекта получить наборы свойств
  2. Для каждого набора свойств проверьте, является ли он набором количества
  3. Для каждого набора количества просмотрите количество

И потенциально повторить этот поиск, если объект имеет тип, определенный пользователем.

Следующий код должен делать именно это (написан на моей машине с python 3.5.4 и ifcopenshell со схемой IFC2X3)):

  1. Получить все slabs из файла (есть только один)
  2. Пройдитесь по всем сущностям в обратном атрибуте IsDefinedBy — это могут быть IfcRelDefinesByProperties или IFcRelDefinesByType.
  3. Получить наборы свойств от сущности
  4. Проверьте, является ли заданный набор свойств IfcElementQuantity, и, если это так, приступите к печати количественных показателей.
import ifcopenshell
def print_quantities(property_definition):
  if 'IfcElementQuantity' == property_definition.is_a():
    for quantity in property_definition.Quantities:
      if 'IfcQuantityArea' == quantity.is_a():
        print('Area value: ' + str(quantity.AreaValue))
      if 'IfcQuantityVolume' == quantity.is_a():
        print('Volume value: ' + str(quantity.VolumeValue))
      if 'IfcQuantityLength' == quantity.is_a():
        print('Length value: ' + str(quantity.LengthValue))

ifc_file = ifcopenshell.open('slab.ifc')
products = ifc_file.by_type('IfcSlab')
for product in products:
  if product.IsDefinedBy:
    definitions = product.IsDefinedBy
    for definition in definitions:
      #In IFC2X3 this could be property or type
      #in IFC4 type is in inverse attribute IsTypedBy
      if 'IfcRelDefinesByProperties' == definition.is_a():
        property_definition = definition.RelatingPropertyDefinition
        print_quantities(property_definition)
      if 'IfcRelDefinesByType' == definition.is_a():
        type = definition.RelatingType
        if type.HasPropertySets:
          for property_definition in type.HasPropertySets:
            print_quantities(property_definition)

Например, это приводит к:

Length value: 300.0
Length value: 22000.0
Area value: 28.0
Area value: 28.0
Volume value: 8.4
Volume value: 8.4
Volume value: 8.4
Volume value: 8.4
Length value: 0.0
Area value: 0.0
Length value: 22000.0
Area value: 28.0
Area value: 28.0
Length value: 300.0
Volume value: 8.4
person Loebl    schedule 24.05.2018
comment
Спасибо Лебл! Я посмотрю на это и сообщу об успехе/неуспехе - person Yafim Simanovsky; 25.05.2018
comment
Привет, Лебл. Пока мне удалось лишь частично, но ваша информация была очень полезной! Чего я не понимаю, так это того, где найти правильное реализуемое имя для величин. Например, для IsDefinedBy строка IFCRELDEFINESBYPROPERTIES, а для строки IFCELEMENTQUANTITY какое правильное имя атрибута? Я посмотрел на ссылки, которые вы приложили, но не мог понять, какую из них использовать. Спасибо - person Yafim Simanovsky; 25.05.2018
comment
Я добавил имена атрибутов в ответ. Имя атрибута RelatingPropertyDefinition. Спецификация определяет его как тип выбора, что означает, что он может указывать на разные классы наборов свойств - вам придется каждый раз проверять нужный класс. На страницах спецификаций, на которые я ссылаюсь, вы можете щелкнуть заголовок Attribute Inheritance ниже, чтобы увидеть все атрибуты для этого объекта. Обратные выделены курсивом. - person Loebl; 26.05.2018
comment
Спасибо за помощь. Насколько я понимаю, базовая геометрия плиты имеет атрибут IsDefinedBy, который ведет ко всем ссылкам этого базового типа. Затем, если я хочу получить количество, мне нужно получить доступ к атрибуту Quantities в некотором наборе количества. Итак, у меня есть все строки типа #102=IFCRELDEFINESBYPROPERTIES( в списке, и я просматриваю этот список одну за другой, но независимо от того, какой атрибут я пытаюсь использовать, он выдает ошибку. Я пытаюсь найти эквивалент IsDefinedBy для результатов того же запроса. Должен ли IfcElementQuantitySet быть атрибутом? - person Yafim Simanovsky; 27.05.2018
comment
Не совсем. Атрибут IsDefinedBy должен возвращать список IFCRELDEFINESBYPROPERTIES объектов. Каждый из них имеет атрибут RelatingPropertyDefiniton, указывающий на объект, который может быть IfcElementQuantity (вам нужно будет проверить тип). Количества находятся в списке атрибута Quantitites. - person Loebl; 27.05.2018
comment
Я нашел объекты IFCRELDEFINESBYPROPERTIES ранее, но RelatingPropertyDefiniton не существовало для экземпляра списка... так что либо я что-то упустил, либо, возможно, нет атрибута RelatingPropertyDefiniton...? - person Yafim Simanovsky; 28.05.2018
comment
Не могли бы вы добавить обновление к своему вопросу, как далеко вы продвинулись? - person Loebl; 28.05.2018
comment
Только что узнал, что IfcOpenShell по умолчанию работает с IFC2X3, который делает несколько деталей по-другому - обновил ответ и привел пример. - person Loebl; 28.05.2018
comment
Я проверю, как скомпилировать для IFC4, потому что я думаю, что это проблема. Я обновил свой вопрос, чтобы отразить достигнутый прогресс. - person Yafim Simanovsky; 28.05.2018
comment
Леобл, я добавил «редактировать: 2» к исходному сообщению, чтобы объяснить, что я сделал на данный момент и где я застрял. У вас есть идеи по этому вопросу? - person Yafim Simanovsky; 10.06.2018
comment
step1 может быть IfcPropertySet или IfcElementQuantity (или другими). ​​Вам нужно будет проверить, относятся ли они к типу IfcElementQuantity. - person Loebl; 10.06.2018
comment
Я не понимаю вашего комментария. Я добавил вывод своего кода на печать в исходный пост, чтобы вы могли видеть, что он мне дает, но я также упомянул, что уже протестировал то, что вы предлагаете, и это дает мне указанную ошибку. я знаю, что шаг 2 - это IfcPropertySet, но я не могу получить дополнительную информацию об этом... - person Yafim Simanovsky; 11.06.2018
comment
IfcPropertySet — это другой тип, чем IfcElementQuantity. Вы можете получить количество только из второго. - person Loebl; 11.06.2018
comment
Да, но пока у меня есть плита, которая является ifcslab, затем я slab.IsDefinedBy, что дает мне набор из пяти элементов IfcPropertySet, которые я повторяю, и я знаю, что они IfcRelDefinesByProperties, и для каждого из них я делаю step1 = item.RelatingPropertyDefinition, так что это дает мне эти строки в файле, но оттуда я ничего не могу сделать с step2.... что бы я ни пытался (как я делал в РЕДАКТИРОВАТЬ 2), он его не распознает. В том числе и то, что вы предлагаете... - person Yafim Simanovsky; 11.06.2018
comment
IfcPropertySet не имеет количества. Вы можете посмотреть на свойства, которые он содержит в своем атрибуте HasProperties, но кажется, что IfcSlab, о котором вы упомянули, не имеет прикрепленных количеств. - person Loebl; 11.06.2018
comment
Верный. Используя HasProperties, я вижу, что у него есть определенные параметры. Но почему у него нет quantities? Как это возможно, учитывая, что он имеет объемную длину и толщину...? - person Yafim Simanovsky; 12.06.2018
comment
IfcElementQuantity должен быть установлен программой, записывающей файл, так как могут быть случаи, когда 3D-геометрия отличается от фактических величин, используемых при построении. Не каждая программа их пишет. IfcOpenShell не будет их вычислять. Однако вы можете попробовать рассчитать некоторые показатели на основе геометрии. - person Loebl; 12.06.2018
comment
То есть вы говорите, что это зависит от настроек экспорта ifc в программе, верно? - person Yafim Simanovsky; 12.06.2018
comment
Вроде. Некоторые программы могут даже не поддерживать его полностью, они не обязаны записывать в файл всю возможную информацию. - person Loebl; 13.06.2018
comment
Привет. Спасибо. Я поигрался с настройками экспорта IFC и теперь знаю, что необработанный файл IFC содержит количества. Я до сих пор не могу понять, что нужно поместить в код, чтобы получить эти строки, на которые есть ссылки. Я обновил свой исходный пост в РЕДАКТИРОВАТЬ 2, чтобы показать соответствующий код. - person Yafim Simanovsky; 13.06.2018
comment
Привет, Лебл, я проверил дальше и все еще застрял. Я снова обновил исходный пост на EDIT 2:. Дайте мне знать, если вы можете помочь. - person Yafim Simanovsky; 14.06.2018
comment
Что ж, если line.is_a() == 'IfcRelDefinesByProperties' применимо, то line.RelatingPropertyDefinition никогда не должно давать сбоев. Не проверяйте там 'IfcRelDefinesByType', сделайте это отдельно, так как у этой сущности есть другие атрибуты. Вы сможете продвинуться дальше с помощью if step2.is_a() == 'IfcElementQuantity', чтобы посмотреть количество. - person Loebl; 15.06.2018
comment
Хм.. Спасибо. Опять же, я думаю, что моя главная проблема заключается в понимании того, как использовать атрибуты. Я просмотрел buildingsmart-tech.org/ifc. /IFC4/Add2TC1/html/link/, но из того, что вы объяснили, атрибуты, используемые для шага 2 после if, должны быть либо IfcPhysicalQuantity, либо Quantities, либо IfcPhysicalQuantity, но ни один из них не работает... - person Yafim Simanovsky; 15.06.2018
comment
Можете ли вы предоставить свой пример файла? Может, это немного прояснит ситуацию. - person Loebl; 15.06.2018
comment
Благодарю вас! Я понял большую часть этого, но ваше решение более эффективно. С чем у меня все еще возникают проблемы, так это с пониманием того, как читать такие страницы, как buildingsmart-tech.org/ifc/IFC4/Add2TC1/html/link/. Откуда вы знаете, что нужно использовать HasPropertySets с этой страницы...? Где это упоминается? - person Yafim Simanovsky; 18.06.2018
comment
На этой странице нигде. Переменная definition в моем коде может иметь сущность IfcRelDefinesByType с атрибутом RelatingType (номер 6). Я присваиваю его переменной type. Если вы перейдете по ссылке в документах, вы попадете на IfcTypeObject с атрибутом HasPropertySets. - person Loebl; 18.06.2018
comment
Привет Лебл. Спасибо за помощь. Я понимаю, как ты обращался с числами. Что насчет материалов? Из моих экспериментов с кодом я вижу, что IfcMaterial, например, не имеет методы, только атрибуты, но .Name не работает, чтобы получить имя материала. - person Yafim Simanovsky; 23.06.2018
comment
Я также попытался просмотреть схему 2x3, поскольку предыдущая ссылка опубликовано для IFC4. Но все же я не вижу связи с деталями имени IfcMaterial. - person Yafim Simanovsky; 23.06.2018
comment
Все они просто атрибуты. IfcMaterial является новым в IFC4 - вам потребуется версия IFC4 IfcOpenShell, чтобы прочитать его правильно. Также, если возникают другие проблемы, пожалуйста, откройте новый вопрос. Мы также могли бы продолжить это обсуждение в чате. - person Loebl; 23.06.2018
comment
Я открыл чат. Спасибо. - person Yafim Simanovsky; 24.06.2018
comment
Привет, Лебл, я написал в чате, но не уверен, что ты это видел. Можете ли вы обновить, если он виден? Спасибо. - person Yafim Simanovsky; 29.06.2018
comment
line.is_a() == 'IfcRelDefinesByProperties' может быть записано как line.is_a('IfcRelDefinesByProperties') - person Ufos; 25.09.2019

Однажды я написал несколько функций для извлечения всех свойств.

https://github.com/johannesmichael/ifc-python/blob/master/modules/ifc_pset_utils.py

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

Базовые количества:

def get_related_quantities(ifc_instance):
"""
Returns a list of IfcElementQuantity for given IFC ID
argument: ifc_instance
return: list of property sets
"""
quantities_list =[]
for x in ifc_instance.IsDefinedBy:
    if x.is_a("IfcRelDefinesByProperties"):
        if x.RelatingPropertyDefinition.is_a("IfcElementQuantity"):
            quantities_list.append(x.RelatingPropertyDefinition)
return quantities_list  

def get_quantity_single_value(x):
"""
Returns a dict of dicts of IfcElementQuantity single values.
Returning a dictionary of dictionaries
is used, because it is easy to transform to pandas.DataFrame 
argument: IFC Element as contained in list from get_related_property_sets()
return: dict of property single values like {"IfcName":"xx", "IfcGlobalId": "klkhlkh", ......}
"""
quantities_dicts = {}
for y in x.Quantities:
    if y.is_a('IfcQuantityArea'):
        quantities_dicts.update({y.Name:y.AreaValue})
    if y.is_a('IfcQuantityLength'):
        quantities_dicts.update({y.Name:y.LengthValue})
    if y.is_a('IfcQuantityVolume'):
        quantities_dicts.update({y.Name:y.VolumeValue})
    if y.is_a('IfcQuantityCount'):
        quantities_dicts.update({y.Name:y.CountValue})
    if y.is_a('IfcQuantityWeight'):
        quantities_dicts.update({y.Name:y.WeightValue})

return quantities_dicts 

Это было сделано для IFC 2x3 TC1 Надеюсь, что помогает

person nanuuq    schedule 06.03.2020