mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-11 06:18:09 +00:00
BIM Tool - hotkey for editing text annotation
Added hotkey in BIM Tool for editing active text annotation (It's binded on Shift + E).
This commit is contained in:
@@ -31,9 +31,15 @@ import blenderbim.tool as tool
|
|||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
|
|
||||||
|
|
||||||
def draw_attributes(props, layout, copy_operator=None):
|
def draw_attributes(props, layout, copy_operator=None, popup_active_attribute=None):
|
||||||
for attribute in props:
|
"""you can set attribute active in popup with `active_attribute`
|
||||||
|
meaning you will be able to type into attribute's field without having to click
|
||||||
|
on it first
|
||||||
|
"""
|
||||||
|
for attribute in props:
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
|
if attribute == popup_active_attribute:
|
||||||
|
row.activate_init = True
|
||||||
draw_attribute(attribute, row, copy_operator)
|
draw_attribute(attribute, row, copy_operator)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ classes = (
|
|||||||
operator.DuplicateDrawing,
|
operator.DuplicateDrawing,
|
||||||
operator.EditAssignedProduct,
|
operator.EditAssignedProduct,
|
||||||
operator.EditText,
|
operator.EditText,
|
||||||
|
operator.EditTextPopup,
|
||||||
operator.EditVectorStyle,
|
operator.EditVectorStyle,
|
||||||
operator.EnableEditingAssignedProduct,
|
operator.EnableEditingAssignedProduct,
|
||||||
operator.EnableEditingText,
|
operator.EnableEditingText,
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ import blenderbim.bim.module.drawing.annotation as annotation
|
|||||||
import blenderbim.bim.module.drawing.sheeter as sheeter
|
import blenderbim.bim.module.drawing.sheeter as sheeter
|
||||||
import blenderbim.bim.module.drawing.scheduler as scheduler
|
import blenderbim.bim.module.drawing.scheduler as scheduler
|
||||||
import blenderbim.bim.module.drawing.helper as helper
|
import blenderbim.bim.module.drawing.helper as helper
|
||||||
from blenderbim.bim.module.drawing.data import DecoratorData
|
from blenderbim.bim.module.drawing.data import DecoratorData, TextData
|
||||||
import blenderbim.bim.export_ifc
|
import blenderbim.bim.export_ifc
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
from mathutils import Vector
|
from mathutils import Vector
|
||||||
@@ -1359,6 +1359,57 @@ class AddSectionsAnnotations(bpy.types.Operator):
|
|||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
class EditTextPopup(bpy.types.Operator):
|
||||||
|
bl_idname = "bim.edit_text_popup"
|
||||||
|
bl_label = "Edit Text"
|
||||||
|
first_run: bpy.props.BoolProperty(default=True)
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
# shares most of the code with BIM_PT_text.draw()
|
||||||
|
# need to keep them in sync or move to some common function
|
||||||
|
|
||||||
|
if not TextData.is_loaded:
|
||||||
|
TextData.load()
|
||||||
|
props = context.active_object.BIMTextProperties
|
||||||
|
|
||||||
|
# skip BoxAlignment since we're going to format it ourselves
|
||||||
|
attributes = [a for a in props.attributes if a.name != "BoxAlignment"]
|
||||||
|
# set first attribute with text to be active by default
|
||||||
|
blenderbim.bim.helper.draw_attributes(attributes, self.layout, popup_active_attribute=attributes[0])
|
||||||
|
row = self.layout.row(align=True)
|
||||||
|
row.prop(props, "font_size")
|
||||||
|
|
||||||
|
# a bit hacky way to align box alignment widget
|
||||||
|
rows = [self.layout.row(align=True) for i in range(3)]
|
||||||
|
for i in range(9):
|
||||||
|
if i % 3 == 0:
|
||||||
|
split = rows[i // 3].split(factor=0.1, align=True)
|
||||||
|
split.column()
|
||||||
|
split.prop(props, "box_alignment", text="", index=i)
|
||||||
|
|
||||||
|
text_lines = ["Text box alignment:", props.attributes["BoxAlignment"].string_value, ""]
|
||||||
|
for i in range(3):
|
||||||
|
split = rows[i].split(factor=0.1, align=False)
|
||||||
|
split.column()
|
||||||
|
split.label(text=text_lines[i])
|
||||||
|
|
||||||
|
def cancel(self, context):
|
||||||
|
# disable editing when dialog is closed
|
||||||
|
bpy.ops.bim.disable_editing_text()
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
# can't use invoke() because this operator
|
||||||
|
# will be run indirectly by hotkey
|
||||||
|
# so we use execute() and track whether it's the first run of the operator
|
||||||
|
if self.first_run:
|
||||||
|
bpy.ops.bim.enable_editing_text()
|
||||||
|
self.first_run = False
|
||||||
|
return context.window_manager.invoke_props_dialog(self)
|
||||||
|
else:
|
||||||
|
bpy.ops.bim.edit_text()
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
class EditText(bpy.types.Operator, Operator):
|
class EditText(bpy.types.Operator, Operator):
|
||||||
bl_idname = "bim.edit_text"
|
bl_idname = "bim.edit_text"
|
||||||
bl_label = "Edit Text"
|
bl_label = "Edit Text"
|
||||||
@@ -1366,6 +1417,7 @@ class EditText(bpy.types.Operator, Operator):
|
|||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
core.edit_text(tool.Ifc, tool.Drawing, obj=context.active_object)
|
core.edit_text(tool.Ifc, tool.Drawing, obj=context.active_object)
|
||||||
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
|
|
||||||
class EnableEditingText(bpy.types.Operator, Operator):
|
class EnableEditingText(bpy.types.Operator, Operator):
|
||||||
|
|||||||
@@ -346,6 +346,9 @@ class BIM_PT_text(Panel):
|
|||||||
props = context.active_object.BIMTextProperties
|
props = context.active_object.BIMTextProperties
|
||||||
|
|
||||||
if props.is_editing:
|
if props.is_editing:
|
||||||
|
# shares most of the code with EditTextPopup.draw()
|
||||||
|
# need to keep them in sync or move to some common function
|
||||||
|
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.operator("bim.edit_text", icon="CHECKMARK")
|
row.operator("bim.edit_text", icon="CHECKMARK")
|
||||||
row.operator("bim.disable_editing_text", icon="CANCEL", text="")
|
row.operator("bim.disable_editing_text", icon="CANCEL", text="")
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import blenderbim.bim.module.type.prop as type_prop
|
|||||||
from blenderbim.bim.helper import prop_with_search, close_operator_panel
|
from blenderbim.bim.helper import prop_with_search, close_operator_panel
|
||||||
from bpy.types import WorkSpaceTool
|
from bpy.types import WorkSpaceTool
|
||||||
from blenderbim.bim.module.model.data import AuthoringData, RailingData, RoofData
|
from blenderbim.bim.module.model.data import AuthoringData, RailingData, RoofData
|
||||||
|
from blenderbim.bim.module.drawing.data import TextData
|
||||||
from blenderbim.bim.module.model import prop
|
from blenderbim.bim.module.model import prop
|
||||||
|
|
||||||
|
|
||||||
@@ -333,6 +334,14 @@ class BimToolUI:
|
|||||||
row.label(text="", icon="EVENT_SHIFT")
|
row.label(text="", icon="EVENT_SHIFT")
|
||||||
row.label(text="", icon="EVENT_E")
|
row.label(text="", icon="EVENT_E")
|
||||||
row.operator("bim.hotkey", text="Edit Roof Path").hotkey = "S_E"
|
row.operator("bim.hotkey", text="Edit Roof Path").hotkey = "S_E"
|
||||||
|
elif (
|
||||||
|
(TextData.is_loaded or not TextData.load())
|
||||||
|
and TextData.data["attributes"]
|
||||||
|
):
|
||||||
|
row = cls.layout.row(align=True)
|
||||||
|
row.label(text="", icon="EVENT_SHIFT")
|
||||||
|
row.label(text="", icon="EVENT_E")
|
||||||
|
row.operator("bim.hotkey", text="Edit text").hotkey = "S_E"
|
||||||
|
|
||||||
row = cls.layout.row(align=True)
|
row = cls.layout.row(align=True)
|
||||||
row.label(text="", icon="EVENT_SHIFT")
|
row.label(text="", icon="EVENT_SHIFT")
|
||||||
@@ -568,6 +577,13 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
bpy.context.object.select_set(True)
|
bpy.context.object.select_set(True)
|
||||||
bpy.ops.bim.enable_editing_roof_path()
|
bpy.ops.bim.enable_editing_roof_path()
|
||||||
|
|
||||||
|
elif (
|
||||||
|
(TextData.is_loaded or not TextData.load())
|
||||||
|
and TextData.data["attributes"]
|
||||||
|
):
|
||||||
|
bpy.context.object.select_set(True)
|
||||||
|
bpy.ops.bim.edit_text_popup()
|
||||||
|
|
||||||
def hotkey_S_F(self):
|
def hotkey_S_F(self):
|
||||||
if not bpy.context.selected_objects:
|
if not bpy.context.selected_objects:
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user