mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 09:48:32 +00:00
util.shape for materials and material_ids
This commit is contained in:
@@ -70,17 +70,6 @@ class MaterialCreator:
|
||||
|
||||
self.mesh = mesh
|
||||
self.obj = obj
|
||||
|
||||
# mesh["ios_materials"] can contain:
|
||||
# - ifc style id if style assigned to the representation items directly
|
||||
# or through material with a style;
|
||||
# - ifc material id if both true:
|
||||
# - element has a material without a style;
|
||||
# - there are parts of the geometry that has no other style assigned to them;
|
||||
# - -1 in case if there is no material;
|
||||
# - 0 in case if there are default materials used.
|
||||
# Though 0 value will not occur as we don't use default materials in IfcImporter.
|
||||
|
||||
self.parsed_meshes.add(self.mesh.name)
|
||||
self.load_texture_maps(shape_has_openings)
|
||||
self.assign_material_slots_to_faces()
|
||||
|
||||
@@ -1567,7 +1567,7 @@ class LoadLinkedProject(bpy.types.Operator):
|
||||
has_processed_chunk = False
|
||||
|
||||
ms = np.vstack([default_mat, ifcopenshell.util.shape.get_material_colors(shape.geometry)])
|
||||
mi = np.frombuffer(shape.geometry.material_ids_buffer, dtype=np.int32)
|
||||
mi = ifcopenshell.util.shape.get_faces_material_style_ids(shape.geometry)
|
||||
for geom_material_idx, geom_material in enumerate(shape.geometry.materials):
|
||||
if not geom_material.instance_id():
|
||||
ms[geom_material_idx + 1] = (0.8, 0.8, 0.8, 1)
|
||||
|
||||
@@ -20,6 +20,7 @@ import shapely
|
||||
import shapely.ops
|
||||
import numpy as np
|
||||
import numpy.typing as npt
|
||||
import ifcopenshell.ifcopenshell_wrapper as W
|
||||
import ifcopenshell.util.element
|
||||
import ifcopenshell.util.placement
|
||||
import ifcopenshell.util.representation
|
||||
@@ -300,6 +301,30 @@ def get_normals(geometry: ShapeType) -> npt.NDArray[np.float64]:
|
||||
return np.frombuffer(geometry.normals_buffer, dtype="d").reshape(-1, 3)
|
||||
|
||||
|
||||
def get_shape_material_styles(geometry: ShapeType) -> tuple[W.style, ...]:
|
||||
"""Get list of material styles.
|
||||
|
||||
Possible values for `style.instance_id()`:
|
||||
- IFC style id if style assigned to the representation items directly
|
||||
or through material with a style;
|
||||
- IFC material id if both true:
|
||||
- element has a material without a style;
|
||||
- there are parts of the geometry that has no other style assigned to them;
|
||||
- -1 in case if there is no material;
|
||||
- 0 in case if there are default materials used.
|
||||
"""
|
||||
return geometry.materials
|
||||
|
||||
|
||||
def get_faces_material_style_ids(geometry: ShapeType) -> npt.NDArray[np.int32]:
|
||||
"""Get material styles ids for the geometry faces.
|
||||
|
||||
Return a list of corresponding indices of styles from get_shape_material_styles for each face.
|
||||
If face has no style assigned, index -1 is used.
|
||||
"""
|
||||
return np.frombuffer(geometry.material_ids_buffer, dtype="i")
|
||||
|
||||
|
||||
def get_faces_representation_item_ids(geometry: ShapeType) -> npt.NDArray[np.int32]:
|
||||
"""Get representation item ids for the geometry faces."""
|
||||
return np.frombuffer(geometry.item_ids_buffer, dtype="i")
|
||||
|
||||
Reference in New Issue
Block a user