IFC mesh 모습을 pyvista로 시각화하는 코드는 다음과 같다.
import pyvista as pv
import ifcopenshell
import ifcopenshell.geom
self.pyvista = pv.Plotter() # 캔버스 정의
self.pyvista.add_axes(line_width=5, labels_off=False) #좌표계 보이게
# IFC geometry 설정
settings = ifcopenshell.geom.settings()
settings.set(settings.USE_WORLD_COORDS, True)
shape = ifcopenshell.geom.create_shape(settings, element)
mesh = shape.geometry
verts = mesh.verts
faces = mesh.faces
# 3개씩 묶어서 grouped_verts 생성
grouped_verts = [[verts[i], verts[i + 1], verts[i + 2]] for i in range(0, len(verts), 3)]
# 3개씩 묶어서 grouped_faces 생성
grouped_faces = [[faces[i], faces[i + 1], faces[i + 2]] for i in range(0, len(faces), 3)]
# 각 face 리스트에 3을 앞에 추가
for idx, face in enumerate(grouped_faces):
# 3을 추가한 리스트를 생성하여 기존 face를 업데이트
face.insert(0, len(face)) # 0번째 인덱스에 3을 삽입
grouped_faces[idx] = face # 해당 인덱스의 face를 업데이트
mesh = pv.PolyData(grouped_verts, grouped_faces)
self.pyvista.add_mesh(mesh)
self.pyvista.show(cpos="xy")
만약 mesh 결과로 verts, faces가 부족하게 나온다거나 오히려 없는 형상까지 더 초과되어 나올 경우에는
ifcopenshell 버전에 문제가 있을 수 있으니 업데이트를 진행하면 된다.
pip install --upgrade ifcopenshell