Separated BimToolUI, added Draw wall icon

Separated BimToolUI into AddElementUI and ModifySelectedUI classes, added Draw wall icon
This commit is contained in:
tim
2024-09-15 14:11:05 -04:00
parent 6aca2014de
commit 0297fd15d7
36 changed files with 149 additions and 488 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 880 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 874 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

+97 -450
View File
@@ -107,7 +107,7 @@ class BimTool(WorkSpaceTool):
def draw_settings(context, layout, ws_tool):
# Unlike operators, Blender doesn't treat workspace tools as a class, so we'll create our own.
BimToolUI.draw(context, layout, ifc_element_type="all")
AddElementUI.draw(context, layout, ifc_element_type="all")
class WallTool(BimTool):
@@ -122,7 +122,9 @@ class WallTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class SlabTool(BimTool):
@@ -137,7 +139,9 @@ class SlabTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class DoorTool(BimTool):
@@ -152,7 +156,9 @@ class DoorTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class WindowTool(BimTool):
@@ -167,7 +173,9 @@ class WindowTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class ColumnTool(BimTool):
@@ -182,7 +190,9 @@ class ColumnTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class BeamTool(BimTool):
@@ -197,7 +207,9 @@ class BeamTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class DuctTool(BimTool):
@@ -212,7 +224,9 @@ class DuctTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class CableCarrierTool(BimTool):
@@ -227,7 +241,9 @@ class CableCarrierTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class PipeTool(BimTool):
@@ -242,7 +258,9 @@ class PipeTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class CableTool(BimTool):
@@ -257,7 +275,9 @@ class CableTool(BimTool):
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
AddElementUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
if context.active_object and context.selected_objects:
ModifySelectedUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
def add_layout_hotkey_operator(layout, text, hotkey, description, ui_context=""):
@@ -292,7 +312,7 @@ def add_layout_hotkey_operator(layout, text, hotkey, description, ui_context="")
## - Apply void button is showing when any two objects are selected - should only appear when a voidable object and a void are selected
## - Type Class and Relating Type fields seem to be crossed between selected and new
class BimToolUI:
class AddElementUI:
@classmethod
def draw(cls, context, layout, ifc_element_type=None):
cls.layout = layout
@@ -313,21 +333,10 @@ class BimToolUI:
elif AuthoringData.data["ifc_element_type"] != ifc_element_type:
AuthoringData.load(ifc_element_type)
cls.draw_container_info(context) if context.region.type == "TOOL_HEADER" else cls
cls.draw_type_manager_launcher(context)
cls.draw_thumbnail() if context.region.type != "TOOL_HEADER" else cls
cls.draw_add_object(context)
if context.active_object and context.selected_objects:
cls.draw_modes(context)
cls.draw_parameter_adjustments(context)
cls.draw_operations(context)
# cls.draw_void(context)
cls.draw_regen_operations(context)
cls.draw_align(context)
cls.draw_aggregation(context)
cls.draw_qto(context)
# cls.draw_side_panel_tool_interface(context) if context.region.type != "TOOL_HEADER" else cls
@classmethod
def draw_container_info(cls, context):
text = AuthoringData.data["default_container"]
@@ -343,6 +352,13 @@ class BimToolUI:
if not AuthoringData.data["ifc_classes"]:
if AuthoringData.data["ifc_element_type"]:
row.label(text=f"No {AuthoringData.data['ifc_element_type']} Found", icon="ERROR")
row = cls.layout.row(align=True)
op = row.operator(
"bim.add_default_type",
icon_value=custom_icon_previews["ADD_TYPE"].icon_id,
text=f"Create default {AuthoringData.data['ifc_element_type']}",
)
op.ifc_element_type = AuthoringData.data["ifc_element_type"]
else:
row.label(text="No Element Types Found", icon="ERROR")
row = cls.layout.row(align=True)
@@ -392,17 +408,15 @@ class BimToolUI:
### this neeeds to move
elif cls.props.ifc_class in ("IfcSpaceType"):
add_layout_hotkey_operator(cls.layout, "Generate", "S_G", bpy.ops.bim.generate_space.__doc__)
add_layout_hotkey_operator(cls.layout, "Generate", "S_G", bpy.ops.bim.generate_space.__doc__, ui_context)
###
else:
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="rl_mode", text="RL Mode" if ui_context != "TOOL_HEADER" else "RL")
# Add button
if AuthoringData.data["ifc_classes"]:
if not AuthoringData.data["ifc_element_type"]: ### for BIM Tool
if not AuthoringData.data["ifc_element_type"]:
row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row
prop_with_search(row, cls.props, "ifc_class", text="Type Class" if ui_context != "TOOL_HEADER" else "")
if AuthoringData.data["relating_type_id"]:
@@ -410,10 +424,63 @@ class BimToolUI:
prop_with_search(row, cls.props, "relating_type_id", text="Relating Type" if ui_context != "TOOL_HEADER" else "")
row.operator("bim.launch_type_manager", icon=tool.Blender.TYPE_MANAGER_ICON, text="")
row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row
row.operator("bim.add_constr_type_instance", text="Add", icon_value=custom_icon_previews[f"ADD"].icon_id)
add_layout_hotkey_operator(row, "Add", "S_A", bpy.ops.bim.add_constr_type_instance.__doc__, ui_context)
row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row
add_layout_hotkey_operator(row, "Draw", "S_P", bpy.ops.bim.draw_polyline_wall.__doc__, ui_context) if cls.props.ifc_class == "IfcWallType" else row
else:
row.label(text="No Construction Type", icon="FILE_3D")
@classmethod
def draw_thumbnail(cls):
if AuthoringData.data["ifc_classes"]:
if cls.props.ifc_class:
box = cls.layout.box()
if AuthoringData.data["type_thumbnail"]:
box.template_icon(icon_value=AuthoringData.data["type_thumbnail"], scale=5)
else:
op = box.operator("bim.load_type_thumbnails", text="Load Thumbnails", icon="FILE_REFRESH")
op.ifc_class = cls.props.ifc_class
class ModifySelectedUI:
@classmethod
def draw(cls, context, layout, ifc_element_type=None):
cls.layout = layout
cls.props = context.scene.BIMModelProperties
row = cls.layout.row(align=True)
if not tool.Ifc.get():
row.label(text="No IFC Project", icon="ERROR")
return
if not PortData.is_loaded:
PortData.load()
if not AuthoringData.is_loaded:
AuthoringData.load(ifc_element_type)
elif ifc_element_type == "all" and AuthoringData.data["ifc_element_type"] is not None:
AuthoringData.load("all")
elif AuthoringData.data["ifc_element_type"] != ifc_element_type:
AuthoringData.load(ifc_element_type)
cls.draw_parameter_adjustments(context)
cls.draw_operations(context)
cls.draw_void(context)
cls.draw_regen_operations(context)
cls.draw_align(context)
cls.draw_aggregation(context)
cls.draw_qto(context)
cls.draw_modes(context)
@classmethod
def draw_container_info(cls, context):
text = AuthoringData.data["default_container"]
if context.region.type == "UI":
text = f"Container: {text}"
cls.layout.row(align=True).label(text=text, icon="OUTLINER_COLLECTION")
@classmethod
def draw_modes(cls, context):
ui_context = str(context.region.type)
@@ -437,17 +504,6 @@ class BimToolUI:
row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row
add_layout_hotkey_operator(row, "Decomposition", "A_D", "Select decomposition", ui_context)
@classmethod
def draw_thumbnail(cls):
if AuthoringData.data["ifc_classes"]:
if cls.props.ifc_class:
box = cls.layout.box()
if AuthoringData.data["type_thumbnail"]:
box.template_icon(icon_value=AuthoringData.data["type_thumbnail"], scale=5)
else:
op = box.operator("bim.load_type_thumbnails", text="Load Thumbnails", icon="FILE_REFRESH")
op.ifc_class = cls.props.ifc_class
@classmethod
def draw_parameter_adjustments(cls, context):
ui_context = str(context.region.type)
@@ -560,7 +616,7 @@ class BimToolUI:
add_layout_hotkey_operator(row, "Regen", "S_G", bpy.ops.bim.regenerate_distribution_element.__doc__, ui_context)
@classmethod
def draw_void(cls, context,row):
def draw_void(cls, context):
ui_context = str(context.region.type)
row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row
if len(context.selected_objects) > 1:
@@ -631,415 +687,6 @@ class BimToolUI:
row.label(text="Quantity Take-off")
add_layout_hotkey_operator(cls.layout, "Perform Quantity Take-off", "S_Q", bpy.ops.bim.perform_quantity_take_off.__doc__, ui_context)
@classmethod
def draw_tool_header_icons(cls, context): ### this function is no longer in use
ui_context = str(context.region.type)
if AuthoringData.data["active_material_usage"] == "LAYER2":
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="extrusion_depth", text="H")
op = row.operator("bim.change_extrusion_depth", icon="FILE_REFRESH", text="")
op.depth = cls.props.extrusion_depth
row.prop(data=cls.props, property="length", text="L")
op = row.operator("bim.change_layer_length", icon="FILE_REFRESH", text="")
op.length = cls.props.length
row.prop(data=cls.props, property="x_angle", text="A")
op = row.operator("bim.change_extrusion_x_angle", icon="FILE_REFRESH", text="")
op.x_angle = cls.props.x_angle
# row = cls.layout.row(align=True)
# row.prop(data=cls.props, property="extrusion_depth", text="Height:")
# op = row.operator("bim.change_extrusion_depth", icon="FILE_REFRESH", text="")
# op.depth = cls.props.extrusion_depth
# row = cls.layout.row(align=True)
# row.prop(data=cls.props, property="length", text="Length:")
# op = row.operator("bim.change_layer_length", icon="FILE_REFRESH", text="")
# op.length = cls.props.length
# row = cls.layout.row(align=True)
# row.prop(data=cls.props, property="x_angle", text="Angle:")
# op = row.operator("bim.change_extrusion_x_angle", icon="FILE_REFRESH", text="")
# op.x_angle = cls.props.x_angle
row = cls.layout.row()
add_layout_hotkey_operator(row, "Regen", "S_G", bpy.ops.bim.recalculate_wall.__doc__, ui_context)
row = cls.layout.row(align=True)
add_layout_hotkey_operator(row, "Extend", "S_E", "Extends/reduces element to 3D cursor", ui_context)
add_layout_hotkey_operator(row, "Butt", "S_T", "Intersects two non-parallel elements to a butt corner junction", ui_context)
add_layout_hotkey_operator(row, "Mitre", "S_Y", "Intersects two non-parallel elements to a mitred corner junction", ui_context)
row.operator("bim.unjoin_walls", text="", icon_value=custom_icon_previews["UNJOIN_WALLS"].icon_id)
row = cls.layout.row(align=True)
add_layout_hotkey_operator(row, "Merge", "S_M", bpy.ops.bim.merge_wall.__doc__, ui_context)
add_layout_hotkey_operator(row, "Split", "S_K", bpy.ops.bim.split_wall.__doc__, ui_context)
add_layout_hotkey_operator(row, "Rotate 90", "S_R", bpy.ops.bim.rotate_90.__doc__, ui_context)
add_layout_hotkey_operator(row, "Flip", "S_F", bpy.ops.bim.flip_wall.__doc__, ui_context)
elif AuthoringData.data["active_material_usage"] == "LAYER3":
if len(context.selected_objects) == 1:
add_layout_hotkey_operator(cls.layout, "Edit Profile", "S_E", "", ui_context)
elif "LAYER2" in AuthoringData.data["selected_material_usages"]:
add_layout_hotkey_operator(cls.layout, "Extend Wall To Slab", "S_E", "", ui_context)
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="x_angle", text="Angle")
op = row.operator("bim.change_extrusion_x_angle", icon="FILE_REFRESH", text="")
op.x_angle = cls.props.x_angle
elif AuthoringData.data["active_material_usage"] == "PROFILE":
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="cardinal_point", text="Axis")
op = row.operator("bim.change_cardinal_point", icon="FILE_REFRESH", text="")
op.cardinal_point = int(cls.props.cardinal_point)
row = cls.layout.row(align=True)
label = (
"Height" if AuthoringData.data["active_class"] in ("IfcColumn", "IfcColumnStandardCase") else "Length"
)
row.prop(data=cls.props, property="extrusion_depth", text=label)
op = row.operator("bim.change_profile_depth", icon="FILE_REFRESH", text="")
op.depth = cls.props.extrusion_depth
row = cls.layout.row(align=True)
add_layout_hotkey_operator(row, "Extend", "S_E", "", ui_context)
add_layout_hotkey_operator(row, "Flip", "S_F", bpy.ops.bim.flip_object.__doc__, ui_context)
if AuthoringData.data["active_class"] in (
"IfcCableCarrierSegment",
"IfcCableSegment",
"IfcDuctSegment",
"IfcPipeSegment",
):
add_layout_hotkey_operator(cls.layout, "Add Fitting", "S_Y", "", ui_context)
if context.region.type != "TOOL_HEADER":
cls.layout.operator("bim.mep_add_bend")
cls.layout.operator("bim.mep_add_transition")
cls.layout.operator("bim.mep_add_obstruction")
else:
add_layout_hotkey_operator(row, "Butt", "S_T", "", ui_context)
add_layout_hotkey_operator(row, "Mitre", "S_Y", "", ui_context)
add_layout_hotkey_operator(row, "Rotate 90", "S_R", bpy.ops.bim.rotate_90.__doc__, ui_context)
add_layout_hotkey_operator(row, "Regen", "S_G", bpy.ops.bim.recalculate_profile.__doc__, ui_context)
# row.operator("bim.extend_profile", icon="X", text="").join_type = ""
elif (
tool.Model.is_parametric_railing_active() and not context.active_object.BIMRailingProperties.is_editing_path
):
# NOTE: should be above "active_representation_type" = "SweptSolid" check
# because it could be a SweptSolid too
row = cls.layout.row(align=True)
row.operator("bim.enable_editing_railing_path", text="", icon_value=custom_icon_previews["EDIT_RAILING_PATH"].icon_id)
elif AuthoringData.data["active_class"] in (
"IfcWindow",
"IfcWindowStandardCase",
"IfcDoor",
"IfcDoorStandardCase",
):
if AuthoringData.data["active_class"] in ("IfcWindow", "IfcWindowStandardCase"):
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="rl2", text="RL")
elif AuthoringData.data["active_class"] in ("IfcDoor", "IfcDoorStandardCase"):
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="rl1", text="RL")
add_layout_hotkey_operator(cls.layout, "Regen", "S_G", bpy.ops.bim.recalculate_fill.__doc__, ui_context)
add_layout_hotkey_operator(cls.layout, "Flip", "S_F", "", ui_context)
elif AuthoringData.data["active_representation_type"] == "SweptSolid":
if not tool.Model.is_parametric_window_active() and not tool.Model.is_parametric_door_active():
add_layout_hotkey_operator(cls.layout, "Edit Profile", "T_E", "", ui_context)
elif AuthoringData.data["active_class"] in ("IfcSpace",):
add_layout_hotkey_operator(cls.layout, "Regen", "S_G", bpy.ops.bim.generate_space.__doc__, ui_context)
elif tool.Model.is_parametric_roof_active() and not context.active_object.BIMRoofProperties.is_editing_path:
row = cls.layout.row(align=True)
row.label(text="", icon="EVENT_TAB")
row.operator("bim.enable_editing_roof_path", text="Edit Roof Path")
if context.region.type != "TOOL_HEADER" and PortData.data["total_ports"] > 0:
add_layout_hotkey_operator(cls.layout, "Regen", "S_G", bpy.ops.bim.regenerate_distribution_element.__doc__, ui_context)
cls.layout.operator("bim.mep_connect_elements")
row = cls.layout.row(align=True)
if len(context.selected_objects) > 1:
row.operator("bim.add_opening", text="", icon_value=custom_icon_previews["VOID"].icon_id)
else:
row.operator("bim.add_potential_opening", text="", icon_value=custom_icon_previews["ADD_VOID"].icon_id)
if AuthoringData.data["is_voidable_element"]:
if AuthoringData.data["has_visible_openings"]:
row = cls.layout.row(align=True)
row.operator("bim.edit_openings", icon="CHECKMARK", text="")
row.operator("bim.hide_openings", icon="CANCEL", text="")
if AuthoringData.data["active_class"] in ("IfcOpeningElement",):
row.operator("bim.edit_openings", icon="CHECKMARK", text="")
row.operator("bim.hide_openings", icon="CANCEL", text="")
if len(context.selected_objects) == 2:
row = cls.layout.row(align=True)
row.label(text="", icon="EVENT_SHIFT")
row.label(text="", icon="EVENT_L")
row.operator("bim.clone_opening", text="Clone Opening")
row = cls.layout.row(align=True)
add_layout_hotkey_operator(row, "Exterior", "S_X", "", ui_context)
add_layout_hotkey_operator(row, "Centreline", "S_C", "", ui_context)
add_layout_hotkey_operator(row, "Interior", "S_V", "", ui_context)
add_layout_hotkey_operator(row, "Mirror", "S_M", bpy.ops.bim.mirror_elements.__doc__, ui_context)
row = cls.layout.row(align=True)
add_layout_hotkey_operator(row, "Void", "A_O", "Toggle openings", ui_context)
add_layout_hotkey_operator(row, "Decomposition", "A_D", "Select decomposition", ui_context)
row = cls.layout.row(align=True)
add_layout_hotkey_operator(row, "Assign", "C_P", bpy.ops.bim.aggregate_assign_object.__doc__, ui_context)
add_layout_hotkey_operator(row, "Unassign", "A_P", bpy.ops.bim.aggregate_unassign_object.__doc__, ui_context)
row = cls.layout.row()
add_layout_hotkey_operator(
row, "Perform Quantity Take-off", "S_Q", bpy.ops.bim.perform_quantity_take_off.__doc__, ui_context
)
@classmethod
def draw_side_panel_tool_interface(cls, context): ### this function is no longer in use
ui_context = str(context.region.type)
row = cls.layout.row(align=True)
if AuthoringData.data["active_material_usage"] == "LAYER2":
row.label(text="LAYER2")
row.prop(data=cls.props, property="extrusion_depth", text="Height")
op = row.operator("bim.change_extrusion_depth", icon="FILE_REFRESH", text="")
op.depth = cls.props.extrusion_depth
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="length", text="Length")
op = row.operator("bim.change_layer_length", icon="FILE_REFRESH", text="")
op.length = cls.props.length
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="x_angle", text="Angle")
op = row.operator("bim.change_extrusion_x_angle", icon="FILE_REFRESH", text="")
op.x_angle = cls.props.x_angle
cls.layout.separator()
add_layout_hotkey_operator(cls.layout, "Regen", "S_G", bpy.ops.bim.recalculate_wall.__doc__, ui_context)
cls.layout.separator()
add_layout_hotkey_operator(cls.layout, "Extend", "S_E", "Extends/reduces element to 3D cursor", ui_context)
add_layout_hotkey_operator(cls.layout, "Butt", "S_T", "Intersects two non-parallel elements to a butt corner junction", ui_context)
add_layout_hotkey_operator(cls.layout, "Mitre", "S_Y", "Intersects two non-parallel elements to a mitred corner junction", ui_context)
row = cls.layout.row(align=True)
row.operator("bim.unjoin_walls", text="Unjoin Walls", icon_value=custom_icon_previews["UNJOIN_WALLS"].icon_id)
cls.layout.separator()
add_layout_hotkey_operator(cls.layout, "Merge", "S_M", bpy.ops.bim.merge_wall.__doc__, ui_context)
add_layout_hotkey_operator(cls.layout, "Split", "S_K", bpy.ops.bim.split_wall.__doc__, ui_context)
add_layout_hotkey_operator(cls.layout, "Rotate 90", "S_R", bpy.ops.bim.rotate_90.__doc__, ui_context)
add_layout_hotkey_operator(cls.layout, "Flip", "S_F", bpy.ops.bim.flip_wall.__doc__, ui_context)
# row.operator("bim.unjoin_walls", icon="X", text="")
elif AuthoringData.data["active_material_usage"] == "LAYER3":
row.label(text="LAYER3")
if len(context.selected_objects) == 1:
add_layout_hotkey_operator(cls.layout, "Edit Profile", "S_E", "", ui_context)
elif "LAYER2" in AuthoringData.data["selected_material_usages"]:
add_layout_hotkey_operator(cls.layout, "Extend Wall To Slab", "S_E", "", ui_context)
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="x_angle", text="Angle")
op = row.operator("bim.change_extrusion_x_angle", icon="FILE_REFRESH", text="")
op.x_angle = cls.props.x_angle
elif AuthoringData.data["active_material_usage"] == "PROFILE":
row.label(text="PROFILE")
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="cardinal_point", text="Axis")
op = row.operator("bim.change_cardinal_point", icon="FILE_REFRESH", text="")
op.cardinal_point = int(cls.props.cardinal_point)
row = cls.layout.row(align=True)
label = (
"Height" if AuthoringData.data["active_class"] in ("IfcColumn", "IfcColumnStandardCase") else "Length"
)
row.prop(data=cls.props, property="extrusion_depth", text=label)
op = row.operator("bim.change_profile_depth", icon="FILE_REFRESH", text="")
op.depth = cls.props.extrusion_depth
add_layout_hotkey_operator(cls.layout, "Extend", "S_E", "", ui_context)
add_layout_hotkey_operator(cls.layout, "Flip", "S_F", bpy.ops.bim.flip_object.__doc__, ui_context)
if AuthoringData.data["active_class"] in (
"IfcCableCarrierSegment",
"IfcCableSegment",
"IfcDuctSegment",
"IfcPipeSegment",
):
cls.layout.row(align=True).label(text="Connections")
add_layout_hotkey_operator(cls.layout, "Add Fitting", "S_Y", "", ui_context)
row = cls.layout.row(align=True)
row.operator("bim.mep_add_bend")
row.label(text="", icon="BLANK1")
row.label(text="", icon="BLANK1")
row = cls.layout.row(align=True)
row.operator("bim.mep_add_transition")
row.label(text="", icon="BLANK1")
row.label(text="", icon="BLANK1")
row = cls.layout.row(align=True)
row.operator("bim.mep_add_obstruction")
row.label(text="", icon="BLANK1")
row.label(text="", icon="BLANK1")
else:
add_layout_hotkey_operator( cls.layout, "Edit Axis", "A_E", "", ui_context)
add_layout_hotkey_operator(cls.layout, "Butt", "S_T", "", ui_context)
add_layout_hotkey_operator(cls.layout, "Mitre", "S_Y", "", ui_context)
add_layout_hotkey_operator(cls.layout, "Rotate 90", "S_R", bpy.ops.bim.rotate_90.__doc__, ui_context)
add_layout_hotkey_operator(cls.layout, "Regen", "S_G", bpy.ops.bim.recalculate_profile.__doc__, ui_context)
# row.operator("bim.extend_profile", icon="X", text="").join_type = ""
elif (tool.Model.is_parametric_railing_active() and not context.active_object.BIMRailingProperties.is_editing_path):
# NOTE: should be above "active_representation_type" = "SweptSolid" check
# because it could be a SweptSolid too
row.label(text="Railing")
row = cls.layout.row(align=True)
row.operator("bim.enable_editing_railing_path", text="Edit Railing Path", icon_value=custom_icon_previews["EDIT_RAILING_PATH"].icon_id)
row.scale_x = 2
row.label(text="", icon="EVENT_TAB")
elif AuthoringData.data["active_class"] in (
"IfcWindow",
"IfcWindowStandardCase",
"IfcDoor",
"IfcDoorStandardCase",
):
row.label(text="WinDoor")
if AuthoringData.data["active_class"] in ("IfcWindow", "IfcWindowStandardCase"):
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="rl2", text="RL")
elif AuthoringData.data["active_class"] in ("IfcDoor", "IfcDoorStandardCase"):
row = cls.layout.row(align=True)
row.prop(data=cls.props, property="rl1", text="RL")
add_layout_hotkey_operator(cls.layout, "Regen", "S_G", bpy.ops.bim.recalculate_fill.__doc__, ui_context)
add_layout_hotkey_operator(cls.layout, "Flip", "S_F", "", ui_context)
elif AuthoringData.data["active_representation_type"] == "SweptSolid":
row.label(text="SweptSolid")
if not tool.Model.is_parametric_window_active() and not tool.Model.is_parametric_door_active():
add_layout_hotkey_operator(cls.layout, "Edit Profile", "S_E", "", ui_context)
elif AuthoringData.data["active_class"] in ("IfcSpace",):
row.label(text="IfcSpace")
add_layout_hotkey_operator(cls.layout, "Regen", "S_G", bpy.ops.bim.generate_space.__doc__, ui_context)
elif tool.Model.is_parametric_roof_active() and not context.active_object.BIMRoofProperties.is_editing_path:
row.label(text="Roof")
row = cls.layout.row(align=True)
row.label(text="", icon="EVENT_TAB")
row.operator("bim.enable_editing_roof_path", text="Edit Roof Path")
if context.region.type != "TOOL_HEADER" and PortData.data["total_ports"] > 0:
add_layout_hotkey_operator(cls.layout, "Regen", "S_G", bpy.ops.bim.regenerate_distribution_element.__doc__, ui_context)
row = cls.layout.row(align=True)
row.operator("bim.mep_connect_elements")
row.label(text="", icon="BLANK1")
row.label(text="", icon="BLANK1")
row = cls.layout.row(align=True)
if len(context.selected_objects) > 1:
row.operator("bim.add_opening", text="Apply Void", icon_value=custom_icon_previews["VOID"].icon_id)
else:
row.operator(
"bim.add_potential_opening", text="Add Void", icon_value=custom_icon_previews["ADD_VOID"].icon_id
)
row.label(text="", icon="EVENT_SHIFT")
row.label(text="", icon="EVENT_O")
if AuthoringData.data["is_voidable_element"]:
row.label(text="Voidable Element")
if AuthoringData.data["has_visible_openings"]:
row = cls.layout.row(align=True)
row.operator("bim.edit_openings", icon="CHECKMARK", text="")
row.operator("bim.hide_openings", icon="CANCEL", text="")
if AuthoringData.data["active_class"] in ("IfcOpeningElement",):
row.label(text="Opening")
row.operator("bim.edit_openings", icon="CHECKMARK", text="")
row.operator("bim.hide_openings", icon="CANCEL", text="")
if len(context.selected_objects) == 2:
row = cls.layout.row(align=True)
row.label(text="", icon="EVENT_SHIFT")
row.label(text="", icon="EVENT_L")
row.operator("bim.clone_opening", text="Clone Opening")
cls.layout.row(align=True).label(text="Align")
add_layout_hotkey_operator(cls.layout, "Exterior", "S_X", "", ui_context)
add_layout_hotkey_operator(cls.layout, "Centreline", "S_C", "", ui_context)
add_layout_hotkey_operator(cls.layout, "Interior", "S_V", "", ui_context)
add_layout_hotkey_operator(cls.layout, "Mirror", "S_M", bpy.ops.bim.mirror_elements.__doc__, ui_context)
cls.layout.row(align=True).label(text="Mode")
add_layout_hotkey_operator(cls.layout, "Edit Axis", "A_E", "", ui_context)
add_layout_hotkey_operator(cls.layout, "Void", "A_O", "Toggle openings", ui_context)
add_layout_hotkey_operator(cls.layout, "Decomposition", "A_D", "Select decomposition", ui_context)
cls.layout.row(align=True).label(text="Aggregation")
add_layout_hotkey_operator(cls.layout, "Assign", "C_P", bpy.ops.bim.aggregate_assign_object.__doc__, ui_context)
add_layout_hotkey_operator(cls.layout, "Unassign", "A_P", bpy.ops.bim.aggregate_unassign_object.__doc__, ui_context)
cls.layout.row(align=True).label(text="Qto")
add_layout_hotkey_operator(cls.layout, "Perform Quantity Take-off", "S_Q", bpy.ops.bim.perform_quantity_take_off.__doc__, ui_context)
@classmethod
def draw_add_type_instance(cls, context): ### this function is no longer in use
row = cls.layout.row(align=True)
if AuthoringData.data["ifc_classes"]:
if not AuthoringData.data["ifc_element_type"]:
prop_with_search(row, cls.props, "ifc_class", text="")
row = cls.layout.row(align=True)
if AuthoringData.data["relating_type_id"]:
prop_with_search(row, cls.props, "relating_type_id", text="")
row.operator("bim.add_constr_type_instance", text="Add", icon_value=custom_icon_previews[f"ADD"].icon_id)
else:
row.label(text="No Construction Type", icon="FILE_3D")
row.operator("bim.launch_type_manager", icon=tool.Blender.TYPE_MANAGER_ICON, text="")
else:
if AuthoringData.data["ifc_element_type"]:
row.label(text=f"No {AuthoringData.data['ifc_element_type']} Found", icon="ERROR")
row = cls.layout.row()
row.prop(cls.props, "type_name")
row = cls.layout.row(align=True)
op = row.operator(
"bim.add_default_type",
icon_value=custom_icon_previews["ADD_TYPE"].icon_id,
text=f"Create {AuthoringData.data['ifc_element_type']}",
)
op.ifc_element_type = AuthoringData.data["ifc_element_type"]
row.operator("bim.launch_type_manager", icon=tool.Blender.TYPE_MANAGER_ICON, text="")
else:
row.label(text="No Element Types Found", icon="ERROR")
row.operator("bim.launch_type_manager", icon=tool.Blender.TYPE_MANAGER_ICON, text="Launch Type Manager")
class Hotkey(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.hotkey"
+52 -38
View File
@@ -27,15 +27,15 @@
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="9.6666668"
inkscape:cx="29.224137"
inkscape:cy="15.517241"
inkscape:window-width="3840"
inkscape:window-height="1620"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:zoom="13.670731"
inkscape:cx="5.4861732"
inkscape:cy="7.2051741"
inkscape:window-width="1839"
inkscape:window-height="1421"
inkscape:window-x="1064"
inkscape:window-y="106"
inkscape:window-maximized="0"
inkscape:current-layer="g34785"
inkscape:current-layer="g37355"
showguides="true"><inkscape:grid
type="axonomgrid"
id="grid5114"
@@ -1289,7 +1289,7 @@
inkscape:groupmode="layer"
id="g34785"
inkscape:label="set_gable_roof_angle"
style="display:inline"><path
style="display:none"><path
id="rect1259-2-1-1-9-18-8-4"
style="display:inline;fill:none;stroke:#00d27b;stroke-width:1.05833;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="M 6.5999941e-7,1.0583328 4.2333333,1.0583333 7.9374999,3.3739587 V 4.2333333 H 5e-7"
@@ -1333,6 +1333,20 @@
inkscape:label="green-right"
transform="rotate(-90)" /></g><g
inkscape:groupmode="layer"
id="g37355"
inkscape:label="draw"
style="display:inline"><path
id="path37347"
style="display:inline;fill:#00d27b;fill-opacity:1;stroke:#00d27b;stroke-width:0;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:label="pencil"
d="M 5.8570068,0.52916666 5.0317342,1.3472046 7.119462,3.4349324 7.9374999,2.6096598 V 1.7166911 L 6.7499755,0.52916666 Z M 4.5619954,1.8128092 0.87074788,5.4704671 0.52916664,7.6729169 l 2e-8,0.264583 0.26458273,1e-7 L 2.9961995,7.5959187 6.6538574,3.9046712 Z"
sodipodi:nodetypes="ccccccccccccccc" /><path
id="path37351"
style="color:#000000;display:inline;fill:#ffffff;stroke-width:0.563779;stroke-miterlimit:0;stroke-dasharray:none;-inkscape-stroke:none;paint-order:stroke fill markers"
d="m 6.2106881,5.005932 0.00193,1.070418 -1.0731715,-2e-7 v 0.5659811 l 1.0731715,1e-7 -0.00193,1.0709689 h 0.5659812 l -0.00193,-1.0709689 1.0731752,-1e-7 V 6.0763498 l -1.0731752,2e-7 0.00193,-1.070418 z"
sodipodi:nodetypes="ccccccccccccc"
inkscape:label="plus" /></g><g
inkscape:groupmode="layer"
id="g27074"
inkscape:label="circle"
style="display:none"><ellipse
@@ -1430,35 +1444,6 @@
inkscape:label="tick-path"
sodipodi:nodetypes="ccc" /></g><g
inkscape:groupmode="layer"
id="g16110"
inkscape:label="add"
style="display:none"><path
style="display:inline;fill:#009a5f;fill-opacity:1;stroke:#00d27b;stroke-width:0;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="M 0.76091855,2.4310578 4.0934898,4.3552832 V 8.2020824 L 0.76091855,6.2767558"
id="path16090"
inkscape:label="side-left"
sodipodi:nodetypes="cccc" /><path
id="path16088"
style="display:inline;fill:#00d27b;fill-opacity:1;stroke:#00d27b;stroke-width:0;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:label="side-right"
d="M 7.7079504,2.4299567 4.3753791,4.3547327 V 8.2009813 L 5.9307258,7.3030093 V 6.9275239 L 4.8570079,6.9245621 V 5.7939105 l 1.0737179,-4e-7 -0.00835,-1.0640864 h 1.1303995 l 10e-8,1.0640864 0.6551778,-0.00165 z"
sodipodi:nodetypes="ccccccccccccc" /><path
style="display:inline;fill:#75ffaf;fill-opacity:1;stroke:#75ffaf;stroke-width:0;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="M 7.5642528,2.187708 4.2344344,4.1113829 0.90461606,2.187708 4.2333333,0.26458379"
id="path16092"
inkscape:label="top"
sodipodi:nodetypes="cccc" /><path
id="path16100"
style="color:#000000;display:inline;fill:#ffffff;stroke-width:0.563779;stroke-miterlimit:0;stroke-dasharray:none;-inkscape-stroke:none;paint-order:stroke fill markers"
d="m 6.2106881,5.005932 0.00193,1.070418 -1.0731715,-2e-7 v 0.5659811 l 1.0731715,1e-7 -0.00193,1.0709689 h 0.5659812 l -0.00193,-1.0709689 1.0731752,-1e-7 V 6.0763498 l -1.0731752,2e-7 0.00193,-1.070418 z"
sodipodi:nodetypes="ccccccccccccc"
inkscape:label="plus" /><path
id="path22995"
style="color:#000000;display:none;fill:#00d27b;stroke-linejoin:round;stroke-miterlimit:0;-inkscape-stroke:none;paint-order:stroke fill markers"
d="m 4.2233784,-0.052978 a 0.14085458,0.14085458 0 0 0 -0.013826,0.0016419 0.14085458,0.14085458 0 0 0 -0.04535,0.01641845 L 0.53343037,2.0370913 a 0.14085458,0.14085458 0 0 0 -0.009402,0.00821 0.14084052,0.14084052 0 0 0 -0.011614,0.0093 0.14085458,0.14085458 0 0 0 -0.0270994,0.031742 0.14084052,0.14084052 0 0 0 -0.002765,0.00328 0.14084052,0.14084052 0 0 0 -0.001106,0.00383 0.14085458,0.14085458 0 0 0 -0.0149323,0.042688 0.14084052,0.14084052 0 0 0 -0.001106,0.0093 0.14085458,0.14085458 0 0 0 -0.002765,0.014777 V 6.3064255 A 0.14085458,0.14085458 0 0 0 0.53343107,6.429564 L 4.1642021,8.5021316 a 0.14085458,0.14085458 0 0 0 0.00387,0.00164 0.14084052,0.14084052 0 0 0 0.032077,0.010946 0.14085458,0.14085458 0 0 0 0.016039,0.00328 0.14084052,0.14084052 0 0 0 0.016038,0.00328 0.14084052,0.14084052 0 0 0 0.017145,-0.00328 0.14085458,0.14085458 0 0 0 0.018251,-0.00328 0.14084052,0.14084052 0 0 0 0.029312,-0.010398 0.14085458,0.14085458 0 0 0 0.00553,-0.00219 L 5.9372798,7.5690161 V 7.2444779 L 4.3749141,8.1370946 V 4.3137837 L 7.7225246,2.4004864 V 5.7427366 H 8.0040269 V 2.1602297 A 0.14085458,0.14085458 0 0 0 7.9315774,2.0370913 L 4.3024645,-0.0349177 A 0.14085458,0.14085458 0 0 0 4.2233784,-0.052978 Z M 4.2322272,0.24802701 7.5781786,2.1596824 4.2333333,4.0718852 0.88848805,2.1596824 Z M 0.74414205,2.401581 4.0917526,4.314331 V 8.1381892 L 0.74414205,6.2243446 Z"
transform="matrix(0.9343902,0,0,0.94423804,0.27774818,0.236059)"
inkscape:label="edges" /></g><g
inkscape:groupmode="layer"
id="g23076"
inkscape:label="add_void"
style="display:none"><path
@@ -1541,6 +1526,35 @@
style="display:inline;fill:#ffffff;stroke:#ffffff;stroke-width:0;stroke-linejoin:round;stroke-miterlimit:0;paint-order:stroke fill markers"
d="M 8.4666674,7.4083326 H 5.8208347 V 1.0583338 h 2.6458321 z"
sodipodi:nodetypes="ccccc" /></g><g
inkscape:groupmode="layer"
id="g16110"
inkscape:label="add"
style="display:none"><path
style="display:inline;fill:#009a5f;fill-opacity:1;stroke:#00d27b;stroke-width:0;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="M 0.76091855,2.4310578 4.0934898,4.3552832 V 8.2020824 L 0.76091855,6.2767558"
id="path16090"
inkscape:label="side-left"
sodipodi:nodetypes="cccc" /><path
id="path16088"
style="display:inline;fill:#00d27b;fill-opacity:1;stroke:#00d27b;stroke-width:0;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:label="side-right"
d="M 7.7079504,2.4299567 4.3753791,4.3547327 V 8.2009813 L 5.9307258,7.3030093 V 6.9275239 L 4.8570079,6.9245621 V 5.7939105 l 1.0737179,-4e-7 -0.00835,-1.0640864 h 1.1303995 l 10e-8,1.0640864 0.6551778,-0.00165 z"
sodipodi:nodetypes="ccccccccccccc" /><path
style="display:inline;fill:#75ffaf;fill-opacity:1;stroke:#75ffaf;stroke-width:0;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="M 7.5642528,2.187708 4.2344344,4.1113829 0.90461606,2.187708 4.2333333,0.26458379"
id="path16092"
inkscape:label="top"
sodipodi:nodetypes="cccc" /><path
id="path16100"
style="color:#000000;display:inline;fill:#ffffff;stroke-width:0.563779;stroke-miterlimit:0;stroke-dasharray:none;-inkscape-stroke:none;paint-order:stroke fill markers"
d="m 6.2106881,5.005932 0.00193,1.070418 -1.0731715,-2e-7 v 0.5659811 l 1.0731715,1e-7 -0.00193,1.0709689 h 0.5659812 l -0.00193,-1.0709689 1.0731752,-1e-7 V 6.0763498 l -1.0731752,2e-7 0.00193,-1.070418 z"
sodipodi:nodetypes="ccccccccccccc"
inkscape:label="plus" /><path
id="path22995"
style="color:#000000;display:none;fill:#00d27b;stroke-linejoin:round;stroke-miterlimit:0;-inkscape-stroke:none;paint-order:stroke fill markers"
d="m 4.2233784,-0.052978 a 0.14085458,0.14085458 0 0 0 -0.013826,0.0016419 0.14085458,0.14085458 0 0 0 -0.04535,0.01641845 L 0.53343037,2.0370913 a 0.14085458,0.14085458 0 0 0 -0.009402,0.00821 0.14084052,0.14084052 0 0 0 -0.011614,0.0093 0.14085458,0.14085458 0 0 0 -0.0270994,0.031742 0.14084052,0.14084052 0 0 0 -0.002765,0.00328 0.14084052,0.14084052 0 0 0 -0.001106,0.00383 0.14085458,0.14085458 0 0 0 -0.0149323,0.042688 0.14084052,0.14084052 0 0 0 -0.001106,0.0093 0.14085458,0.14085458 0 0 0 -0.002765,0.014777 V 6.3064255 A 0.14085458,0.14085458 0 0 0 0.53343107,6.429564 L 4.1642021,8.5021316 a 0.14085458,0.14085458 0 0 0 0.00387,0.00164 0.14084052,0.14084052 0 0 0 0.032077,0.010946 0.14085458,0.14085458 0 0 0 0.016039,0.00328 0.14084052,0.14084052 0 0 0 0.016038,0.00328 0.14084052,0.14084052 0 0 0 0.017145,-0.00328 0.14085458,0.14085458 0 0 0 0.018251,-0.00328 0.14084052,0.14084052 0 0 0 0.029312,-0.010398 0.14085458,0.14085458 0 0 0 0.00553,-0.00219 L 5.9372798,7.5690161 V 7.2444779 L 4.3749141,8.1370946 V 4.3137837 L 7.7225246,2.4004864 V 5.7427366 H 8.0040269 V 2.1602297 A 0.14085458,0.14085458 0 0 0 7.9315774,2.0370913 L 4.3024645,-0.0349177 A 0.14085458,0.14085458 0 0 0 4.2233784,-0.052978 Z M 4.2322272,0.24802701 7.5781786,2.1596824 4.2333333,4.0718852 0.88848805,2.1596824 Z M 0.74414205,2.401581 4.0917526,4.314331 V 8.1381892 L 0.74414205,6.2243446 Z"
transform="matrix(0.9343902,0,0,0.94423804,0.27774818,0.236059)"
inkscape:label="edges" /></g><g
id="g1377"
inkscape:label="ifc"
style="display:none"><path

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 120 KiB