mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-25 09:32:37 +00:00
Styles are applied per mesh data now (potentially dangerous). Fix crash when switching to representation which has styles from an unstyled mesh.
This commit is contained in:
@@ -60,7 +60,6 @@ class MaterialCreator:
|
|||||||
|
|
||||||
def create(self, element, obj, mesh):
|
def create(self, element, obj, mesh):
|
||||||
self.mesh = mesh
|
self.mesh = mesh
|
||||||
self.obj = obj
|
|
||||||
if (hasattr(element, "Representation") and not element.Representation) or (
|
if (hasattr(element, "Representation") and not element.Representation) or (
|
||||||
hasattr(element, "RepresentationMaps") and not element.RepresentationMaps
|
hasattr(element, "RepresentationMaps") and not element.RepresentationMaps
|
||||||
):
|
):
|
||||||
@@ -140,11 +139,11 @@ class MaterialCreator:
|
|||||||
def assign_material_slots_to_faces(self):
|
def assign_material_slots_to_faces(self):
|
||||||
if "ios_materials" not in self.mesh or not self.mesh["ios_materials"]:
|
if "ios_materials" not in self.mesh or not self.mesh["ios_materials"]:
|
||||||
return
|
return
|
||||||
if len(self.obj.material_slots) == 1:
|
if len(self.mesh.materials) == 1:
|
||||||
return
|
return
|
||||||
material_to_slot = {}
|
material_to_slot = {}
|
||||||
for i, material in enumerate(self.mesh["ios_materials"]):
|
for i, material in enumerate(self.mesh["ios_materials"]):
|
||||||
slot_index = self.obj.material_slots.find(self.styles[material].name)
|
slot_index = self.mesh.materials.find(self.styles[material].name)
|
||||||
material_to_slot[i] = slot_index
|
material_to_slot[i] = slot_index
|
||||||
|
|
||||||
if len(self.mesh.polygons) == len(self.mesh["ios_material_ids"]):
|
if len(self.mesh.polygons) == len(self.mesh["ios_material_ids"]):
|
||||||
|
|||||||
@@ -681,32 +681,33 @@ class EditExtrusionProfile(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
|
|
||||||
# Only certain classes should have a footprint
|
# Only certain classes should have a footprint
|
||||||
if element.is_a() not in ("IfcSlab", "IfcRamp"):
|
if element.is_a() not in ("IfcSlab", "IfcRamp"):
|
||||||
return {"FINISHED"}
|
return
|
||||||
|
|
||||||
footprint_context = ifcopenshell.util.representation.get_context(
|
footprint_context = ifcopenshell.util.representation.get_context(
|
||||||
tool.Ifc.get(), "Plan", "FootPrint", "SKETCH_VIEW"
|
tool.Ifc.get(), "Plan", "FootPrint", "SKETCH_VIEW"
|
||||||
)
|
)
|
||||||
if footprint_context:
|
if not footprint_context:
|
||||||
curves = [profile.OuterCurve]
|
return
|
||||||
if profile.is_a("IfcArbitraryProfileDefWithVoids"):
|
|
||||||
curves.extend(profile.InnerCurves)
|
curves = [profile.OuterCurve]
|
||||||
new_footprint = ifcopenshell.api.run(
|
if profile.is_a("IfcArbitraryProfileDefWithVoids"):
|
||||||
"geometry.add_footprint_representation", tool.Ifc.get(), context=footprint_context, curves=curves
|
curves.extend(profile.InnerCurves)
|
||||||
|
new_footprint = ifcopenshell.api.run(
|
||||||
|
"geometry.add_footprint_representation", tool.Ifc.get(), context=footprint_context, curves=curves
|
||||||
|
)
|
||||||
|
old_footprint = ifcopenshell.util.representation.get_representation(
|
||||||
|
element, "Plan", "FootPrint", "SKETCH_VIEW"
|
||||||
|
)
|
||||||
|
if old_footprint:
|
||||||
|
for inverse in tool.Ifc.get().get_inverse(old_footprint):
|
||||||
|
ifcopenshell.util.element.replace_attribute(inverse, old_footprint, new_footprint)
|
||||||
|
blenderbim.core.geometry.remove_representation(
|
||||||
|
tool.Ifc, tool.Geometry, obj=obj, representation=old_footprint
|
||||||
)
|
)
|
||||||
old_footprint = ifcopenshell.util.representation.get_representation(
|
else:
|
||||||
element, "Plan", "FootPrint", "SKETCH_VIEW"
|
ifcopenshell.api.run(
|
||||||
|
"geometry.assign_representation", tool.Ifc.get(), product=element, representation=new_footprint
|
||||||
)
|
)
|
||||||
if old_footprint:
|
|
||||||
for inverse in tool.Ifc.get().get_inverse(old_footprint):
|
|
||||||
ifcopenshell.util.element.replace_attribute(inverse, old_footprint, new_footprint)
|
|
||||||
blenderbim.core.geometry.remove_representation(
|
|
||||||
tool.Ifc, tool.Geometry, obj=obj, representation=old_footprint
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
ifcopenshell.api.run(
|
|
||||||
"geometry.assign_representation", tool.Ifc.get(), product=element, representation=new_footprint
|
|
||||||
)
|
|
||||||
return {"FINISHED"}
|
|
||||||
|
|
||||||
|
|
||||||
class ResetVertex(bpy.types.Operator):
|
class ResetVertex(bpy.types.Operator):
|
||||||
|
|||||||
Reference in New Issue
Block a user