diff --git a/src/blenderbim/blenderbim/bim/module/system/__init__.py b/src/blenderbim/blenderbim/bim/module/system/__init__.py index f87f83740d..6cc772e135 100644 --- a/src/blenderbim/blenderbim/bim/module/system/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/system/__init__.py @@ -31,6 +31,7 @@ classes = ( operator.EnableEditingSystem, operator.HidePorts, operator.LoadSystems, + operator.RemovePort, operator.RemoveSystem, operator.SelectSystemProducts, operator.SetFlowDirection, diff --git a/src/blenderbim/blenderbim/bim/module/system/operator.py b/src/blenderbim/blenderbim/bim/module/system/operator.py index 94349cfd74..9b9165e97d 100644 --- a/src/blenderbim/blenderbim/bim/module/system/operator.py +++ b/src/blenderbim/blenderbim/bim/module/system/operator.py @@ -154,13 +154,22 @@ class HidePorts(bpy.types.Operator, Operator): class AddPort(bpy.types.Operator, Operator): bl_idname = "bim.add_port" - bl_label = "Add Ports" + bl_label = "Add Port" bl_options = {"REGISTER", "UNDO"} def _execute(self, context): core.add_port(tool.Ifc, tool.System, element=tool.Ifc.get_entity(context.active_object)) +class RemovePort(bpy.types.Operator, Operator): + bl_idname = "bim.remove_port" + bl_label = "Remove Port" + bl_options = {"REGISTER", "UNDO"} + + def _execute(self, context): + core.remove_port(tool.Ifc, tool.System, port=tool.Ifc.get_entity(context.active_object)) + + class ConnectPort(bpy.types.Operator, Operator): bl_idname = "bim.connect_port" bl_label = "Connect Ports" diff --git a/src/blenderbim/blenderbim/bim/module/system/ui.py b/src/blenderbim/blenderbim/bim/module/system/ui.py index 2d38d902c0..e65e90f87f 100644 --- a/src/blenderbim/blenderbim/bim/module/system/ui.py +++ b/src/blenderbim/blenderbim/bim/module/system/ui.py @@ -185,6 +185,7 @@ class BIM_PT_port(Panel): row.operator("bim.set_flow_direction", icon="BACK", text="").direction = "SINK" row.operator("bim.set_flow_direction", icon="ARROW_LEFTRIGHT", text="").direction = "SOURCEANDSINK" row.operator("bim.set_flow_direction", icon="RESTRICT_INSTANCED_ON", text="").direction = "NOTDEFINED" + row.operator("bim.remove_port", icon="X", text="") class BIM_UL_systems(UIList): diff --git a/src/blenderbim/blenderbim/core/system.py b/src/blenderbim/blenderbim/core/system.py index 490739bd0e..b635521222 100644 --- a/src/blenderbim/blenderbim/core/system.py +++ b/src/blenderbim/blenderbim/core/system.py @@ -97,6 +97,11 @@ def add_port(ifc, system, element=None): ifc.run("system.assign_port", element=element, port=port) +def remove_port(ifc, system, port=None): + system.delete_element_objects([port]) + ifc.run("root.remove_product", product=port) + + def connect_port(ifc, port1=None, port2=None): ifc.run("system.connect_port", port1=port1, port2=port2) diff --git a/src/blenderbim/test/core/test_system.py b/src/blenderbim/test/core/test_system.py index df8ff35228..01c4171def 100644 --- a/src/blenderbim/test/core/test_system.py +++ b/src/blenderbim/test/core/test_system.py @@ -92,6 +92,15 @@ class TestSelectSystemProducts: class TestShowPorts: def test_run(self, ifc, system): + ifc.get_object("element").should_be_called().will_return("obj") + ifc.is_moved("obj").should_be_called().will_return(False) + + system.get_ports("element").should_be_called().will_return(["port"]) + system.load_ports("element", ["port"]).should_be_called() + system.select_elements(["port"]).should_be_called() + subject.show_ports(ifc, system, element="element") + + def test_syncing_locations_if_objects_moved_prior_to_showing_ports(self, ifc, system): ifc.get_object("element").should_be_called().will_return("obj") ifc.is_moved("obj").should_be_called().will_return(True) system.run_geometry_edit_object_placement(obj="obj").should_be_called() @@ -104,6 +113,20 @@ class TestShowPorts: class TestHidePorts: def test_run(self, ifc, system): + ifc.get_object("element").should_be_called().will_return("obj") + ifc.is_moved("obj").should_be_called().will_return(False) + + system.get_ports("element").should_be_called().will_return(["port"]) + + ifc.get_object("port").should_be_called().will_return("port_obj") + ifc.is_moved("port_obj").should_be_called().will_return(True) + system.run_geometry_edit_object_placement(obj="port_obj").should_be_called() + + system.delete_element_objects(["port"]).should_be_called() + subject.hide_ports(ifc, system, element="element") + + + def test_syncing_locations_if_objects_moved_prior_to_hiding_ports(self, ifc, system): ifc.get_object("element").should_be_called().will_return("obj") ifc.is_moved("obj").should_be_called().will_return(True) system.run_geometry_edit_object_placement(obj="obj").should_be_called() @@ -128,6 +151,13 @@ class TestAddPort: subject.add_port(ifc, system, element="element") +class TestRemovePort: + def test_run(self, ifc, system): + system.delete_element_objects(["port"]).should_be_called() + ifc.run("root.remove_product", product="port").should_be_called() + subject.remove_port(ifc, system, port="port") + + class TestSetFlowDirection: def test_run(self, ifc, system): system.get_connected_port("port").should_be_called().will_return("port2")