IfcOpenShell: ошибка Segfault при попытке вернуть словарь, содержащий объекты ifcopenshell и соответствующие им фигуры

#python #python-3.x #ifc #bim #ifc-open-shell

#python #python-3.x #ifc #bim #ifc-open-shell

Вопрос:

я пытаюсь извлечь все IfcProduct-shapes из файла ifc и вернуть их (с соответствующим продуктом) в другую часть моей программы. Проблема в том, что когда я пытаюсь вернуть словарь, содержащий эти объекты с соответствующими им формами, программа завершается с ошибкой сегментации. Во время отладки я увидел, что данные сохраняются в структуре данных, но сразу после возврата или при попытке доступа к данным, содержащимся в этом dict, отладчик завершает работу с ошибкой segfault.

Я установил ifcopenshell через conda и запустил его в виртуальной машине ubuntu docker.

Это код, который я пытаюсь запустить:

 def create_shapes_from_ifcopenshell_object(ifcopenshell_object) -> dict:
"""Creates a shape from the given IfcOpenShell Object and returns a dictionary containing the GlobalId as the key
and the product and shape as dictionary."""
try:
    print("Creating shape-objects from IfcProducts.")
    settings = ifcopenshell.geom.settings()
    products = ifcopenshell_object
    product_shapes_dict = {}
    for product in products:
        if product.is_a("IfcOpeningElement") or product.is_a("IfcSite") or product.is_a("IfcAnnotation"):
            continue
        if product.Representation is not None:
            try:
                shape = ifcopenshell.geom.create_shape(settings, product).geometry
            except Exception as e:
                print(str(e)   ". Product:"   str(product))
                continue
            shape_entry = {"guid": product.GlobalId,
                           "product": product,
                           "shape": shape}
            product_shapes_dict[shape_entry["guid"]] = shape_entry
except RuntimeError as re:
    print("Runtime error"   str(re))
    return {"ERROR": str(e)}
except Exception as e:
    print("ERROR during shape creation.")
    return {"ERROR": str(e)}
# pprint(product_shapes_dict) <-- THIS SHOWS THE CORRECT DICT
return product_shapes_dict # <-- Segfault directly after this
  

Ответ №1:

Исправлена проблема в моем коде путем синтаксического анализа продукта в словаре shape_entry в строку.

 shape_entry = {"guid": product.GlobalId,
                     "product": str(product),
                     "shape": shape}