Add support for storing subitems of a representation, like a profile. See #865.

This commit is contained in:
Dion Moult
2020-06-18 11:50:23 +10:00
parent 76e7205692
commit 391ae80e36
@@ -735,6 +735,10 @@ class IfcImporter():
for item in obj.data['ios_items']: for item in obj.data['ios_items']:
vg = obj.vertex_groups.new(name=item['name']) vg = obj.vertex_groups.new(name=item['name'])
vg.add([v.index for v in obj.data.vertices[cumulative_vertex_index:cumulative_vertex_index+item['total_vertices']]], 1, 'ADD') vg.add([v.index for v in obj.data.vertices[cumulative_vertex_index:cumulative_vertex_index+item['total_vertices']]], 1, 'ADD')
for subitem in item['subitems']:
vg = obj.vertex_groups.new(name=subitem['name'])
vg.add([v + cumulative_vertex_index for v in subitem['vertices']],
1, 'ADD')
cumulative_vertex_index += item['total_vertices'] cumulative_vertex_index += item['total_vertices']
def create_native_mesh(self, element, shape): def create_native_mesh(self, element, shape):
@@ -751,23 +755,25 @@ class IfcImporter():
if item.id() in data: if item.id() in data:
item = data[item.id()] item = data[item.id()]
if item.is_a() == 'IfcExtrudedAreaSolid': if item.is_a() == 'IfcExtrudedAreaSolid':
bm = self.create_native_extruded_area_solid(item, element) native = self.create_native_extruded_area_solid(item, element)
if bm: if native:
bmesh.ops.transform(bm, matrix=representation['matrix'], verts=bm.verts) bmesh.ops.transform(
items.append({'blender': bm, 'raw': item}) native['blender'], matrix=representation['matrix'], verts=native['blender'].verts)
items.append(native)
else: else:
items.append(None) items.append(None)
elif item.is_a('IfcSweptDiskSolid'): elif item.is_a('IfcSweptDiskSolid'):
items.append({ items.append({
'blender': self.transform_curve( 'blender': self.transform_curve(
self.create_native_swept_disk_solid(item, element), representation['matrix']), self.create_native_swept_disk_solid(item, element), representation['matrix']),
'raw': item 'raw': item,
'subitems': []
}) })
elif item.is_a('IfcFacetedBrep'): elif item.is_a('IfcFacetedBrep'):
bm = self.create_native_faceted_brep(item, element) bm = self.create_native_faceted_brep(item, element)
if bm: if bm:
bmesh.ops.transform(bm, matrix=representation['matrix'], verts=bm.verts) bmesh.ops.transform(bm, matrix=representation['matrix'], verts=bm.verts)
items.append({'blender': bm, 'raw': item}) items.append({'blender': bm, 'raw': item, 'subitems': []})
else: else:
items.append(None) items.append(None)
else: else:
@@ -797,7 +803,8 @@ class IfcImporter():
elif isinstance(item['blender'], bmesh.types.BMesh): elif isinstance(item['blender'], bmesh.types.BMesh):
representation_items.append({ representation_items.append({
'name': item['raw'].is_a(), 'name': item['raw'].is_a(),
'total_vertices': len(item['blender'].verts) 'total_vertices': len(item['blender'].verts),
'subitems': item['subitems']
}) })
total_polygons = len(item['blender'].faces) total_polygons = len(item['blender'].faces)
if merged_bm is None: if merged_bm is None:
@@ -881,29 +888,46 @@ class IfcImporter():
def create_native_extruded_area_solid(self, item, element): def create_native_extruded_area_solid(self, item, element):
#print(shape.materials) #print(shape.materials)
subitems = []
if item.SweptArea.is_a() == 'IfcArbitraryClosedProfileDef': if item.SweptArea.is_a() == 'IfcArbitraryClosedProfileDef':
shape = ifcopenshell.geom.create_shape(self.settings_native, item.SweptArea.OuterCurve) shape = ifcopenshell.geom.create_shape(self.settings_native, item.SweptArea.OuterCurve)
bm = self.bmesh_from_pydata(*self.shape_to_mesh(shape)) bm = self.bmesh_from_pydata(*self.shape_to_mesh(shape))
bm.faces.new([v for v in bm.verts]) bm.faces.new([v for v in bm.verts])
bm.faces.ensure_lookup_table() bm.faces.ensure_lookup_table()
subitems.append({
'name': item.SweptArea.is_a(),
'vertices': range(0, len(bm.verts))
})
elif item.SweptArea.is_a() == 'IfcRectangleProfileDef': elif item.SweptArea.is_a() == 'IfcRectangleProfileDef':
bm = self.bmesh_from_rectangle(item.SweptArea.XDim, item.SweptArea.YDim) bm = self.bmesh_from_rectangle(item.SweptArea.XDim, item.SweptArea.YDim)
if item.SweptArea.Position: if item.SweptArea.Position:
bmesh.ops.transform(bm, matrix=self.get_axis2placement(item.SweptArea.Position), verts=bm.verts) bmesh.ops.transform(bm, matrix=self.get_axis2placement(item.SweptArea.Position), verts=bm.verts)
bmesh.ops.transform(bm, matrix=mathutils.Matrix() * self.unit_scale, verts=bm.verts) bmesh.ops.transform(bm, matrix=mathutils.Matrix() * self.unit_scale, verts=bm.verts)
subitems.append({
'name': item.SweptArea.is_a(),
'vertices': [0, 1, 2, 3]
})
else: else:
# TODO: what if we can't handle it? # TODO: what if we can't handle it?
return return
results = bmesh.ops.extrude_face_region(bm, geom=[bm.faces[0]]) results = bmesh.ops.extrude_face_region(bm, geom=[bm.faces[0]])
bm.faces.ensure_lookup_table() bm.faces.ensure_lookup_table()
offset = self.unit_scale * item.Depth * mathutils.Vector(item.ExtrudedDirection.DirectionRatios) offset = self.unit_scale * item.Depth * mathutils.Vector(item.ExtrudedDirection.DirectionRatios)
subitems.append({
'name': 'ExtrudedDirection',
'vertices': [0, len(subitems[-1]['vertices'])]
})
for geom in results['geom']: for geom in results['geom']:
if isinstance(geom, bmesh.types.BMVert): if isinstance(geom, bmesh.types.BMVert):
geom.co += offset geom.co += offset
if item.Position: if item.Position:
bmesh.ops.transform( bmesh.ops.transform(
bm, matrix=self.scale_matrix(self.get_axis2placement(item.Position)), verts=bm.verts) bm, matrix=self.scale_matrix(self.get_axis2placement(item.Position)), verts=bm.verts)
return bm return {
'blender': bm,
'raw': item,
'subitems': subitems
}
#mesh['ios_material_ids'] = [0] * len(bm.faces) #mesh['ios_material_ids'] = [0] * len(bm.faces)
def bmesh_from_rectangle(self, x, y): def bmesh_from_rectangle(self, x, y):