Add description to Image Scaling Tool operator for clarity + black

This commit is contained in:
falken10vdl
2025-12-16 09:26:28 +01:00
parent d2dfeb79a3
commit fdf741b209
5 changed files with 71 additions and 67 deletions
+2 -1
View File
@@ -895,11 +895,12 @@ class IfcImporter:
material = obj.data.materials[0] material = obj.data.materials[0]
if material.use_nodes and material.node_tree: if material.use_nodes and material.node_tree:
for node in material.node_tree.nodes: for node in material.node_tree.nodes:
if node.type == 'TEX_IMAGE' and node.image: if node.type == "TEX_IMAGE" and node.image:
image = node.image image = node.image
break break
if image: if image:
import bmesh import bmesh
bm = bmesh.new() bm = bmesh.new()
bm.from_mesh(obj.data) bm.from_mesh(obj.data)
if not bm.loops.layers.uv: if not bm.loops.layers.uv:
@@ -3711,7 +3711,7 @@ class AddReferenceImage(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
if getattr(self, 'show_dimensions_dialog', False): if getattr(self, "show_dimensions_dialog", False):
if tool.Ifc.get(): if tool.Ifc.get():
length_unit = ifcopenshell.util.unit.get_project_unit(tool.Ifc.get(), "LENGTHUNIT") length_unit = ifcopenshell.util.unit.get_project_unit(tool.Ifc.get(), "LENGTHUNIT")
if length_unit: if length_unit:
@@ -3735,14 +3735,14 @@ class AddReferenceImage(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
layout.prop(self, "use_existing_object_by_name") layout.prop(self, "use_existing_object_by_name")
def invoke(self, context, event): def invoke(self, context, event):
if not getattr(self, 'show_dimensions_dialog', False): if not getattr(self, "show_dimensions_dialog", False):
context.window_manager.fileselect_add(self) context.window_manager.fileselect_add(self)
return {'RUNNING_MODAL'} return {"RUNNING_MODAL"}
else: else:
return context.window_manager.invoke_props_dialog(self) return context.window_manager.invoke_props_dialog(self)
def execute(self, context): def execute(self, context):
if not getattr(self, 'show_dimensions_dialog', False): if not getattr(self, "show_dimensions_dialog", False):
abs_path = Path(self.filepath).absolute().resolve() abs_path = Path(self.filepath).absolute().resolve()
if self.override_existing_image: if self.override_existing_image:
params = {"check_existing": True, "force_reload": True} params = {"check_existing": True, "force_reload": True}
@@ -3766,8 +3766,8 @@ class AddReferenceImage(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
bpy.data.images.remove(image) bpy.data.images.remove(image)
except Exception as e: except Exception as e:
self.report({'ERROR'}, f"Failed to load image: {str(e)}") self.report({"ERROR"}, f"Failed to load image: {str(e)}")
return {'CANCELLED'} return {"CANCELLED"}
self.show_dimensions_dialog = True self.show_dimensions_dialog = True
return context.window_manager.invoke_props_dialog(self) return context.window_manager.invoke_props_dialog(self)
@@ -3844,7 +3844,6 @@ class AddReferenceImage(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
) )
tool.Blender.remove_data_block(temp_mesh) tool.Blender.remove_data_block(temp_mesh)
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
if element and isinstance(obj.data, bpy.types.Mesh): if element and isinstance(obj.data, bpy.types.Mesh):
representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW")
@@ -3855,7 +3854,7 @@ class AddReferenceImage(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
tool.Blender.Attribute.fill_attribute(obj.data, "ios_item_ids", "FACE", "INT", [item_id] * num_faces) tool.Blender.Attribute.fill_attribute(obj.data, "ios_item_ids", "FACE", "INT", [item_id] * num_faces)
for item in representation.Items: for item in representation.Items:
if item.is_a('IfcPolygonalFaceSet') and item.Coordinates: if item.is_a("IfcPolygonalFaceSet") and item.Coordinates:
new_coords = [] new_coords = []
for vertex in obj.data.vertices: for vertex in obj.data.vertices:
co = obj.matrix_world @ vertex.co co = obj.matrix_world @ vertex.co
@@ -3902,7 +3901,7 @@ class AddReferenceImage(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
tool.Style.reload_material_from_ifc(material) tool.Style.reload_material_from_ifc(material)
tool.Geometry.record_object_materials(obj) tool.Geometry.record_object_materials(obj)
return {'FINISHED'} return {"FINISHED"}
class ConvertSVGToDXF(bpy.types.Operator): class ConvertSVGToDXF(bpy.types.Operator):
@@ -2843,6 +2843,7 @@ class ClearMeasurement(bpy.types.Operator):
tool.Blender.update_viewport() tool.Blender.update_viewport()
return {"FINISHED"} return {"FINISHED"}
class ImageScalingTool(bpy.types.Operator, PolylineOperator): class ImageScalingTool(bpy.types.Operator, PolylineOperator):
bl_idname = "bim.image_scaling_tool" bl_idname = "bim.image_scaling_tool"
bl_label = "Image Scaling Tool" bl_label = "Image Scaling Tool"
@@ -2891,7 +2892,7 @@ class ImageScalingTool(bpy.types.Operator, PolylineOperator):
if event.type == "LEFTMOUSE" and event.value == "PRESS": if event.type == "LEFTMOUSE" and event.value == "PRESS":
if len(self.selected_points) < 2: if len(self.selected_points) < 2:
snapped_point = self.snapping_points[0] snapped_point = self.snapping_points[0]
point_3d = snapped_point['point'].copy() point_3d = snapped_point["point"].copy()
self.selected_points.append(point_3d) self.selected_points.append(point_3d)
if len(self.selected_points) == 2: if len(self.selected_points) == 2:
@@ -2918,7 +2919,9 @@ class ImageScalingTool(bpy.types.Operator, PolylineOperator):
elif event.type in {"BACK_SPACE", "DEL"} and event.value == "PRESS": elif event.type in {"BACK_SPACE", "DEL"} and event.value == "PRESS":
if len(self.current_distance_value) > 0: if len(self.current_distance_value) > 0:
self.current_distance_value = self.current_distance_value[:-1] self.current_distance_value = self.current_distance_value[:-1]
distance_value = float(self.current_distance_value) if self.current_distance_value else self.calculated_distance distance_value = (
float(self.current_distance_value) if self.current_distance_value else self.calculated_distance
)
self.input_ui.set_value("DISTANCE", distance_value) self.input_ui.set_value("DISTANCE", distance_value)
self.handle_keyboard_input(context, event) self.handle_keyboard_input(context, event)
@@ -2937,7 +2940,7 @@ class ImageScalingTool(bpy.types.Operator, PolylineOperator):
def cancel_tool(self, context): def cancel_tool(self, context):
context.workspace.status_text_set(text=None) context.workspace.status_text_set(text=None)
if hasattr(self, 'tool_state'): if hasattr(self, "tool_state"):
self.tool_state.plane_method = None self.tool_state.plane_method = None
PolylineDecorator.uninstall() PolylineDecorator.uninstall()
tool.Blender.update_viewport() tool.Blender.update_viewport()
@@ -3021,7 +3024,7 @@ class ImageScalingTool(bpy.types.Operator, PolylineOperator):
if element and element.Representation: if element and element.Representation:
for representation in element.Representation.Representations: for representation in element.Representation.Representations:
for item in representation.Items: for item in representation.Items:
if item.is_a('IfcPolygonalFaceSet') and item.Coordinates: if item.is_a("IfcPolygonalFaceSet") and item.Coordinates:
new_coords = [] new_coords = []
for vertex in mesh.vertices: for vertex in mesh.vertices:
co = self.target_object.matrix_world @ vertex.co co = self.target_object.matrix_world @ vertex.co
@@ -3037,5 +3040,3 @@ class ImageScalingTool(bpy.types.Operator, PolylineOperator):
tool.Blender.update_viewport() tool.Blender.update_viewport()
return {"FINISHED"} return {"FINISHED"}
@@ -78,6 +78,7 @@ class ExploreTool(bpy.types.WorkSpaceTool):
row = layout.row(align=True) row = layout.row(align=True)
op = row.operator("bim.explore_hotkey", text="Image Scaling Tool", icon="IMAGE_PLANE") op = row.operator("bim.explore_hotkey", text="Image Scaling Tool", icon="IMAGE_PLANE")
op.hotkey = "S_S" op.hotkey = "S_S"
op.description = "Scale Image Annotation. Allows to scale an IfcReferenceImage. Select image, select tool. Check lower left corner instructions to select two points and provide real distance between them"
class ExploreHotkey(bpy.types.Operator): class ExploreHotkey(bpy.types.Operator):
@@ -124,11 +125,13 @@ class ExploreHotkey(bpy.types.Operator):
selected_objects = tool.Blender.get_selected_objects() selected_objects = tool.Blender.get_selected_objects()
element = tool.Ifc.get_entity(active_obj) if active_obj else None element = tool.Ifc.get_entity(active_obj) if active_obj else None
if (not active_obj or if (
not element or not active_obj
not element.is_a("IfcAnnotation") or or not element
len(selected_objects) != 1 or or not element.is_a("IfcAnnotation")
not tool.Drawing.is_annotation_object_type(element, "IMAGE")): or len(selected_objects) != 1
or not tool.Drawing.is_annotation_object_type(element, "IMAGE")
):
self.report({"ERROR"}, "Please select one image annotation first.") self.report({"ERROR"}, "Please select one image annotation first.")
return return