我有这个型号
class Tramif_PCI_agrup(models.Model):
id = models.AutoField(primary_key=True)
pci = models.FloatField(null=True)
geom = models.LineStringField(geography=True, srid=4326, null=True)
我想使用 IFCOpenShell 库转换为 IFCRoad,以获得最终的 IFC 文件,其中每个对象及其几何和 PCI 值。
这是我尝试过的,但没有成功
# Get all objects from the Tramif_PCI_agrup model
tramif_pci_agrups = Tramif_PCI_agrup.objects.all()
# Create a blank model
ifc_file = ifcopenshell.file(schema='IFC4X3')
# Create an IfcRoad entity
road = ifc_file.create_entity("IfcRoad")
road.Name = "Simple Road"
# Fetch objects from the model and iterate over them
for tramif_object in tramif_pci_agrups:
# Extract geometry and PCI values from the model object
geom = tramif_object.geom
pci = tramif_object.pci
# Convert the geometry to WKT format
wkt_geom = geom.wkt
# Create an IfcAlignment entity for each object
alignment = ifc_file.create_entity("IfcAlignment")
alignment.Name = f"Alignment {tramif_object.id}"
alignment.Description = f"PCI: {pci}"
# Create an IfcAlignmentCurve entity for the geometry
curve = ifc_file.create_entity("IfcAlignmentCurve")
curve.Axis = ifc_file.create_entity("IfcCurve")
curve.Axis.Points = ifc_file.create_entity("IfcPointList")
curve.Axis.Points.Coordinates = [(coord[0], coord[1], 0) for coord in GEOSGeometry(wkt_geom)]
# Add the alignment curve to the alignment entity
alignment.Representation = curve
# Add the alignment entity to the road
road.Representation = alignment
# Write the IFC file
ifc_file.write("/images/road_test.ifc")
但是它给了我错误
Entity with name 'IfcAlignmentCurve' not found in schema 'IFC4X3'
我做错了什么?有什么解决办法吗?我寻找了一个通过 IFCOpenShell 生成 IFCRoad 的示例,但什么也没有
当前的IFC4.3版本(Add 2)没有定义类型
IfcAlignmentCurve
。我认为您应该将 IfcCurve
实体直接设置为 IfcAlignment
实体的表示项。这是通过 IfcShapeRepresentation
(多个产品表示的集合)和 IfcRepesentation
(保存表示上下文和相应的表示项目,例如曲线)来完成的。另请注意,IfcCurve
是抽象的。我假设您想使用它的子类型 IfcPolyline
,它是对齐表示允许的表示项目类型之一。
您可以在官方文档中找到示例,例如IfcAlignment 的示例。您还可以咨询buildingSMART论坛的开发人员部分,了解与模式相关的具体问题。