From 170985662507b9484f739c16f5ee37dec07a1be9 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Tue, 1 Dec 2020 19:43:18 +0000 Subject: [PATCH 01/38] fixed z positioning with respect to default workplane --- paramak/parametric_components/port_cutters_circular.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paramak/parametric_components/port_cutters_circular.py b/paramak/parametric_components/port_cutters_circular.py index b6aa508d0..667ce4f67 100644 --- a/paramak/parametric_components/port_cutters_circular.py +++ b/paramak/parametric_components/port_cutters_circular.py @@ -51,4 +51,4 @@ def __init__( self.radius = radius def find_points(self): - self.points = [(0, self.z_pos)] + self.points = [(self.z_pos, 0)] From 3c640fe13d3e75b8d1a27027cf17cc2b44a67a15 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Tue, 1 Dec 2020 19:45:25 +0000 Subject: [PATCH 02/38] fixed port cutters with respect to default workplane --- paramak/parametric_components/port_cutters_rectangular.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paramak/parametric_components/port_cutters_rectangular.py b/paramak/parametric_components/port_cutters_rectangular.py index 4ac5fc9b4..8dae6714a 100644 --- a/paramak/parametric_components/port_cutters_rectangular.py +++ b/paramak/parametric_components/port_cutters_rectangular.py @@ -65,7 +65,7 @@ def find_points(self): (self.width / 2, self.height / 2), (-self.width / 2, self.height / 2), ] - points = [(e[0], e[1] + self.z_pos) for e in points] + points = [(e[1] + self.z_pos, e[0]) for e in points] self.points = points def add_fillet(self): From 3de73b7cb077701a3003575d66db34fc8364c5dc Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Wed, 2 Dec 2020 17:04:12 +0000 Subject: [PATCH 03/38] removed z_pos and added center_point --- .../parametric_components/port_cutters_circular.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/paramak/parametric_components/port_cutters_circular.py b/paramak/parametric_components/port_cutters_circular.py index 667ce4f67..340df2bba 100644 --- a/paramak/parametric_components/port_cutters_circular.py +++ b/paramak/parametric_components/port_cutters_circular.py @@ -7,10 +7,9 @@ class PortCutterCircular(ExtrudeCircleShape): other components (eg. blanket, vessel,..) in order to create ports. Args: - z_pos (float): Z position (cm) of the port - height (float): height (cm) of the port - width (float): width (cm) of the port - distance (float): extruded distance (cm) of the cutter + center_point (tuple of floats): Defaults to (0, 0). + radius (float): radius (cm) of port. + distance (float): extruded distance (cm) of the cutter. stp_filename (str, optional): defaults to "PortCutterCircular.stp". stl_filename (str, optional): defaults to "PortCutterCircular.stl". name (str, optional): defaults to "circular_port_cutter". @@ -21,9 +20,9 @@ class PortCutterCircular(ExtrudeCircleShape): def __init__( self, - z_pos, radius, distance, + center_point=(0, 0), workplane="ZY", rotation_axis="Z", extrusion_start_offset=1., @@ -47,8 +46,8 @@ def __init__( **kwargs ) - self.z_pos = z_pos + self.center_point = center_point self.radius = radius def find_points(self): - self.points = [(self.z_pos, 0)] + self.points = [self.center_point] From d8c739f27b2d91020f2c90518d554890aa1542ec Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Wed, 2 Dec 2020 17:04:22 +0000 Subject: [PATCH 04/38] removed z_pos and added center_point --- .../port_cutters_rectangular.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/paramak/parametric_components/port_cutters_rectangular.py b/paramak/parametric_components/port_cutters_rectangular.py index 8dae6714a..956b5057f 100644 --- a/paramak/parametric_components/port_cutters_rectangular.py +++ b/paramak/parametric_components/port_cutters_rectangular.py @@ -7,10 +7,10 @@ class PortCutterRectangular(ExtrudeStraightShape): other components (eg. blanket, vessel,..) in order to create ports. Args: - z_pos (float): Z position (cm) of the port - height (float): height (cm) of the port - width (float): width (cm) of the port - distance (float): extruded distance (cm) of the cutter + center_point (tuple of floats): Defaults to (0, 0). + height (float): height (cm) of the port. + width (float): width (cm) of the port. + distance (float): extruded distance (cm) of the cutter. fillet_radius (float, optional): If not None, radius (cm) of fillets added to edges orthogonal to the Z direction. Defaults to None. stp_filename (str, optional): defaults to "PortCutterRectangular.stp". @@ -24,10 +24,10 @@ class PortCutterRectangular(ExtrudeStraightShape): def __init__( self, - z_pos, height, width, distance, + center_point=(0, 0), workplane="ZY", rotation_axis="Z", extrusion_start_offset=1., @@ -52,7 +52,7 @@ def __init__( **kwargs ) - self.z_pos = z_pos + self.center_point = center_point self.height = height self.width = width self.fillet_radius = fillet_radius @@ -65,7 +65,7 @@ def find_points(self): (self.width / 2, self.height / 2), (-self.width / 2, self.height / 2), ] - points = [(e[1] + self.z_pos, e[0]) for e in points] + points = [(e[0]+self.center_point[0], e[1]+self.center_point[1]) for e in points] self.points = points def add_fillet(self): From 8948ab52e6640b8991e4454a686adc5916695b06 Mon Sep 17 00:00:00 2001 From: autopep8 Date: Wed, 2 Dec 2020 17:47:45 +0000 Subject: [PATCH 05/38] Automated autopep8 fixes --- paramak/parametric_components/port_cutters_rectangular.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/paramak/parametric_components/port_cutters_rectangular.py b/paramak/parametric_components/port_cutters_rectangular.py index 956b5057f..450fd2356 100644 --- a/paramak/parametric_components/port_cutters_rectangular.py +++ b/paramak/parametric_components/port_cutters_rectangular.py @@ -65,7 +65,8 @@ def find_points(self): (self.width / 2, self.height / 2), (-self.width / 2, self.height / 2), ] - points = [(e[0]+self.center_point[0], e[1]+self.center_point[1]) for e in points] + points = [(e[0] + self.center_point[0], e[1] + + self.center_point[1]) for e in points] self.points = points def add_fillet(self): From c63bcbb67315521fb372f98e63437c6b35fa29fc Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 08:30:08 +0000 Subject: [PATCH 06/38] updated tests to use center_point instead of z_pos --- .../test_PortCutterCircular.py | 23 ++++++++++--------- .../test_PortCutterRectangular.py | 3 ++- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/tests/test_parametric_components/test_PortCutterCircular.py b/tests/test_parametric_components/test_PortCutterCircular.py index a6d5e7197..d988f6b9e 100644 --- a/tests/test_parametric_components/test_PortCutterCircular.py +++ b/tests/test_parametric_components/test_PortCutterCircular.py @@ -4,16 +4,17 @@ import paramak -# class test_component(unittest.TestCase): -# TODO: fix issue 548 -# def test_creation(self): -# """Checks a PortCutterCircular creation.""" +class test_component(unittest.TestCase): -# test_component = paramak.PortCutterCircular( -# distance=3, -# z_pos=0.25, -# radius=0.1, -# azimuth_placement_angle=[0, 45, 90, 180] -# ) + def test_creation(self): + """Checks a PortCutterCircular creation.""" -# assert test_component.solid is not None + test_component = paramak.PortCutterCircular( + center_point=(0, 0), + distance=3, + radius=0.1, + extrusion_start_offset=1, + azimuth_placement_angle=[0, 45, 90, 180] + ) + + assert test_component.solid is not None diff --git a/tests/test_parametric_components/test_PortCutterRectangular.py b/tests/test_parametric_components/test_PortCutterRectangular.py index 0f927ccc3..9855b92ae 100644 --- a/tests/test_parametric_components/test_PortCutterRectangular.py +++ b/tests/test_parametric_components/test_PortCutterRectangular.py @@ -10,11 +10,12 @@ def test_creation(self): """Checks a PortCutterRectangular creation.""" test_component = paramak.PortCutterRectangular( + center_point = (0, 0), distance=3, - z_pos=0, height=0.2, width=0.4, fillet_radius=0.02, + extrusion_start_offset=1, azimuth_placement_angle=[0, 45, 90, 180] ) From e76844b97c48c2e75f55512b27c29f9149c54ed9 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 09:32:50 +0000 Subject: [PATCH 07/38] added global component for tests and added default parameters test --- .../test_PortCutterCircular.py | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/tests/test_parametric_components/test_PortCutterCircular.py b/tests/test_parametric_components/test_PortCutterCircular.py index d988f6b9e..f5ed8afa9 100644 --- a/tests/test_parametric_components/test_PortCutterCircular.py +++ b/tests/test_parametric_components/test_PortCutterCircular.py @@ -6,15 +6,26 @@ class test_component(unittest.TestCase): - def test_creation(self): - """Checks a PortCutterCircular creation.""" - - test_component = paramak.PortCutterCircular( - center_point=(0, 0), - distance=3, - radius=0.1, - extrusion_start_offset=1, - azimuth_placement_angle=[0, 45, 90, 180] + def setUp(self): + self.test_shape = paramak.PortCutterCircular( + distance=300, radius=20 ) - assert test_component.solid is not None + def test_default_parameters(self): + """Checks that the default parameters of a PortCutterCircular are correct.""" + + assert self.center_point == (0, 0) + assert self.workplane == "ZY" + assert self.rotation_axis == "Z" + assert self.extrusion_start_offset == 1 + assert self.stp_filename == "PortCutterCircular.stp" + assert self.stl_filename == "PortCutterCircular.stl" + assert self.name == "circular_port_cutter" + assert self.material_tag == "circular_port_cutter_mat" + + def test_creation(self): + """Creates a circular port cutter using the PortCutterCircular parametric + component and checks that a cadquery solid is created.""" + + assert self.test_shape.solid is not None + assert self.test_shape.volume > 1000 From 5006a9674b6a9d5d945a513e12b5f99ec4cc1f82 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 09:50:44 +0000 Subject: [PATCH 08/38] added global component and default parameter test --- .../test_PortCutterRectangular.py | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/tests/test_parametric_components/test_PortCutterRectangular.py b/tests/test_parametric_components/test_PortCutterRectangular.py index 9855b92ae..4c6ac5fef 100644 --- a/tests/test_parametric_components/test_PortCutterRectangular.py +++ b/tests/test_parametric_components/test_PortCutterRectangular.py @@ -6,17 +6,26 @@ class TestPortCutterRectangular(unittest.TestCase): - def test_creation(self): - """Checks a PortCutterRectangular creation.""" - - test_component = paramak.PortCutterRectangular( - center_point = (0, 0), - distance=3, - height=0.2, - width=0.4, - fillet_radius=0.02, - extrusion_start_offset=1, - azimuth_placement_angle=[0, 45, 90, 180] + def setUp(self): + self.test_shape = paramak.PortCutterRectangular( + width=40, height=40, distance=300 ) - assert test_component.solid is not None + def test_default_parameters(self): + """Checks that the default parameters of a PortCutterRectangular are correct.""" + + assert self.center_point = (0, 0) + assert self.workplane = "ZY" + assert self.rotation_axis == "Z" + assert self.extrusion_start_offset == 1 + assert self.stp_filename == "PortCutterRectangular.stp" + assert self.stl_filename == "PortCutterRectangular.stl" + assert self.name == "rectangular_port_cutter" + assert self.material_tag == "rectangular_port_cutter_mat" + + def test_creation(self): + """Creates a rectangular port cutter using the PortCutterRectangular parametric + component and checks that a cadquery solid is created.""" + + assert self.test_shape.solid is not None + assert self.test_shape.volume > 1000 From b0fb477eeddcd711d77f86c7993536bdf5168679 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 10:04:39 +0000 Subject: [PATCH 09/38] fixed assertions and added relative volume test --- .../test_PortCutterCircular.py | 31 +++++++++++++------ .../test_PortCutterRectangular.py | 28 ++++++++++++----- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/tests/test_parametric_components/test_PortCutterCircular.py b/tests/test_parametric_components/test_PortCutterCircular.py index f5ed8afa9..34cf1f9d2 100644 --- a/tests/test_parametric_components/test_PortCutterCircular.py +++ b/tests/test_parametric_components/test_PortCutterCircular.py @@ -3,6 +3,8 @@ import paramak +import pytest + class test_component(unittest.TestCase): @@ -14,18 +16,29 @@ def setUp(self): def test_default_parameters(self): """Checks that the default parameters of a PortCutterCircular are correct.""" - assert self.center_point == (0, 0) - assert self.workplane == "ZY" - assert self.rotation_axis == "Z" - assert self.extrusion_start_offset == 1 - assert self.stp_filename == "PortCutterCircular.stp" - assert self.stl_filename == "PortCutterCircular.stl" - assert self.name == "circular_port_cutter" - assert self.material_tag == "circular_port_cutter_mat" + assert self.test_shape.center_point == (0, 0) + assert self.test_shape.workplane == "ZY" + assert self.test_shape.rotation_axis == "Z" + assert self.test_shape.extrusion_start_offset == 1 + assert self.test_shape.stp_filename == "PortCutterCircular.stp" + assert self.test_shape.stl_filename == "PortCutterCircular.stl" + assert self.test_shape.name == "circular_port_cutter" + assert self.test_shape.material_tag == "circular_port_cutter_mat" def test_creation(self): """Creates a circular port cutter using the PortCutterCircular parametric component and checks that a cadquery solid is created.""" assert self.test_shape.solid is not None - assert self.test_shape.volume > 1000 + assert self.test_shape.volume > 1000 + + def test_relative_volume(self): + """Creates PortCutterCircular shapes and checks that their relative volumes + are correct.""" + + test_volume = self.test_shape.volume + + self.test_shape.extrusion_start_offset = 20 + self.test_shape.azimuth_placement_angle = [0, 90, 180, 270] + + assert self.test_shape.volume == pytest.approx(test_volume * 4) diff --git a/tests/test_parametric_components/test_PortCutterRectangular.py b/tests/test_parametric_components/test_PortCutterRectangular.py index 4c6ac5fef..53c14aa57 100644 --- a/tests/test_parametric_components/test_PortCutterRectangular.py +++ b/tests/test_parametric_components/test_PortCutterRectangular.py @@ -3,6 +3,7 @@ import paramak +import pytest class TestPortCutterRectangular(unittest.TestCase): @@ -14,14 +15,14 @@ def setUp(self): def test_default_parameters(self): """Checks that the default parameters of a PortCutterRectangular are correct.""" - assert self.center_point = (0, 0) - assert self.workplane = "ZY" - assert self.rotation_axis == "Z" - assert self.extrusion_start_offset == 1 - assert self.stp_filename == "PortCutterRectangular.stp" - assert self.stl_filename == "PortCutterRectangular.stl" - assert self.name == "rectangular_port_cutter" - assert self.material_tag == "rectangular_port_cutter_mat" + assert self.test_shape.center_point == (0, 0) + assert self.test_shape.workplane == "ZY" + assert self.test_shape.rotation_axis == "Z" + assert self.test_shape.extrusion_start_offset == 1 + assert self.test_shape.stp_filename == "PortCutterRectangular.stp" + assert self.test_shape.stl_filename == "PortCutterRectangular.stl" + assert self.test_shape.name == "rectangular_port_cutter" + assert self.test_shape.material_tag == "rectangular_port_cutter_mat" def test_creation(self): """Creates a rectangular port cutter using the PortCutterRectangular parametric @@ -29,3 +30,14 @@ def test_creation(self): assert self.test_shape.solid is not None assert self.test_shape.volume > 1000 + + def test_relative_volume(self): + """Creates PortCutterRectangular shapes and checks that their relative volumes + are correct.""" + + test_volume = self.test_shape.volume + + self.test_shape.extrusion_start_offset = 20 + self.test_shape.azimuth_placement_angle = [0, 90, 180, 270] + + assert self.test_shape.volume == pytest.approx(test_volume * 4) From 20d8dbbc39db025d357ee82213252ebbf40e5528 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 10:19:26 +0000 Subject: [PATCH 10/38] added absolute volume test --- .../test_PortCutterCircular.py | 13 +++++++++++++ .../test_PortCutterRectangular.py | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/tests/test_parametric_components/test_PortCutterCircular.py b/tests/test_parametric_components/test_PortCutterCircular.py index 34cf1f9d2..f66c9b340 100644 --- a/tests/test_parametric_components/test_PortCutterCircular.py +++ b/tests/test_parametric_components/test_PortCutterCircular.py @@ -1,4 +1,5 @@ +import math import unittest import paramak @@ -42,3 +43,15 @@ def test_relative_volume(self): self.test_shape.azimuth_placement_angle = [0, 90, 180, 270] assert self.test_shape.volume == pytest.approx(test_volume * 4) + + def test_absolute_volume(self): + """Creates a PortCutterCircular shape and checks that its volume is correct.""" + + assert self.test_shape.volume == pytest.approx(math.pi * (20**2) * 300) + + self.test_shape.extrusion_start_offset = 20 + self.test_shape.azimuth_placement_angle = [0, 90, 180, 270] + self.test_shape.radius = 10 + + assert self.test_shape.volume == pytest.approx(math.pi * (10**2) * 300 * 4) + diff --git a/tests/test_parametric_components/test_PortCutterRectangular.py b/tests/test_parametric_components/test_PortCutterRectangular.py index 53c14aa57..2cf89122c 100644 --- a/tests/test_parametric_components/test_PortCutterRectangular.py +++ b/tests/test_parametric_components/test_PortCutterRectangular.py @@ -41,3 +41,15 @@ def test_relative_volume(self): self.test_shape.azimuth_placement_angle = [0, 90, 180, 270] assert self.test_shape.volume == pytest.approx(test_volume * 4) + + def test_absolute_volume(self): + """Creates a PortCutterRectangular shape and checks that its volume is correct.""" + + assert self.test_shape.volume == pytest.approx(40 * 40 * 300) + + self.test_shape.extrusion_start_offset = 20 + self.test_shape.azimuth_placement_angle = [0, 90, 180, 270] + self.test_shape.width = 20 + self.test_shape.height = 20 + + assert self.test_shape.volume == pytest.approx(20 * 20 * 300 * 4) From 37e65f980c27edc367c838f03f33305295d0540a Mon Sep 17 00:00:00 2001 From: autopep8 Date: Thu, 3 Dec 2020 10:21:32 +0000 Subject: [PATCH 11/38] Automated autopep8 fixes --- tests/test_parametric_components/test_PortCutterCircular.py | 4 ++-- .../test_parametric_components/test_PortCutterRectangular.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_parametric_components/test_PortCutterCircular.py b/tests/test_parametric_components/test_PortCutterCircular.py index f66c9b340..efc1ea607 100644 --- a/tests/test_parametric_components/test_PortCutterCircular.py +++ b/tests/test_parametric_components/test_PortCutterCircular.py @@ -53,5 +53,5 @@ def test_absolute_volume(self): self.test_shape.azimuth_placement_angle = [0, 90, 180, 270] self.test_shape.radius = 10 - assert self.test_shape.volume == pytest.approx(math.pi * (10**2) * 300 * 4) - + assert self.test_shape.volume == pytest.approx( + math.pi * (10**2) * 300 * 4) diff --git a/tests/test_parametric_components/test_PortCutterRectangular.py b/tests/test_parametric_components/test_PortCutterRectangular.py index 2cf89122c..f6929faf0 100644 --- a/tests/test_parametric_components/test_PortCutterRectangular.py +++ b/tests/test_parametric_components/test_PortCutterRectangular.py @@ -5,6 +5,7 @@ import pytest + class TestPortCutterRectangular(unittest.TestCase): def setUp(self): @@ -39,7 +40,7 @@ def test_relative_volume(self): self.test_shape.extrusion_start_offset = 20 self.test_shape.azimuth_placement_angle = [0, 90, 180, 270] - + assert self.test_shape.volume == pytest.approx(test_volume * 4) def test_absolute_volume(self): From a7b85598e94b963a4700b9d83217d3b45fcdef75 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 10:29:18 +0000 Subject: [PATCH 12/38] added assertion --- tests/test_parametric_components/test_PortCutterRectangular.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_parametric_components/test_PortCutterRectangular.py b/tests/test_parametric_components/test_PortCutterRectangular.py index 2cf89122c..9cae578b2 100644 --- a/tests/test_parametric_components/test_PortCutterRectangular.py +++ b/tests/test_parametric_components/test_PortCutterRectangular.py @@ -19,6 +19,7 @@ def test_default_parameters(self): assert self.test_shape.workplane == "ZY" assert self.test_shape.rotation_axis == "Z" assert self.test_shape.extrusion_start_offset == 1 + assert self.test_shape.fillet_radius == None assert self.test_shape.stp_filename == "PortCutterRectangular.stp" assert self.test_shape.stl_filename == "PortCutterRectangular.stl" assert self.test_shape.name == "rectangular_port_cutter" From ca7f67eed3f8cefde59a3166f6ebc66c1ded2997 Mon Sep 17 00:00:00 2001 From: autopep8 Date: Thu, 3 Dec 2020 10:30:31 +0000 Subject: [PATCH 13/38] Automated autopep8 fixes --- tests/test_parametric_components/test_PortCutterRectangular.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_parametric_components/test_PortCutterRectangular.py b/tests/test_parametric_components/test_PortCutterRectangular.py index 19c1eb0ed..9b21016af 100644 --- a/tests/test_parametric_components/test_PortCutterRectangular.py +++ b/tests/test_parametric_components/test_PortCutterRectangular.py @@ -20,7 +20,7 @@ def test_default_parameters(self): assert self.test_shape.workplane == "ZY" assert self.test_shape.rotation_axis == "Z" assert self.test_shape.extrusion_start_offset == 1 - assert self.test_shape.fillet_radius == None + assert self.test_shape.fillet_radius is None assert self.test_shape.stp_filename == "PortCutterRectangular.stp" assert self.test_shape.stl_filename == "PortCutterRectangular.stl" assert self.test_shape.name == "rectangular_port_cutter" From 76a596521f23730ec69b42b511ed214dad400e36 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 11:00:56 +0000 Subject: [PATCH 14/38] updated filleting to work in any workplane --- paramak/parametric_components/port_cutters_rectangular.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paramak/parametric_components/port_cutters_rectangular.py b/paramak/parametric_components/port_cutters_rectangular.py index 450fd2356..99efd2d52 100644 --- a/paramak/parametric_components/port_cutters_rectangular.py +++ b/paramak/parametric_components/port_cutters_rectangular.py @@ -71,4 +71,4 @@ def find_points(self): def add_fillet(self): if self.fillet_radius is not None and self.fillet_radius != 0: - self.solid = self.solid.edges('#Z').fillet(self.fillet_radius) + self.solid = self.solid.edges().fillet(self.fillet_radius) From 0bed8a9853b9b384ef9ef4b31915a716c90d13b6 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 13:08:07 +0000 Subject: [PATCH 15/38] added port cutting method --- paramak/utils.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/paramak/utils.py b/paramak/utils.py index 4ba232328..a70d0ef4a 100644 --- a/paramak/utils.py +++ b/paramak/utils.py @@ -208,6 +208,58 @@ def calculate_wedge_cut(self): return cutting_wedge +def perform_port_cutting(self, *args): + + components = [] + + if self.port_type == None and self.port_azimuth_placement_angle == None \ + and self.port_distance == None and self.port_start_radius == None: + + for component in args: + components.append(component) + return components + + else: + if self.port_type == "circular": + if self.port_height != None or self.port_width != None: + raise ValueError('only port_radius should be specified') + if self.port_radius == None: + raise ValueError('port_radius must be specified') + + port_cutter = paramak.PortCutterCircular( + center_point = self.port_center_point, + radius = self.port_radius, + distance = self.port_distance, + extrusion_start_offset = self.port_start_radius, + azimuth_placement_angle = self.port_azimuth_placement_angle + ) + + elif self.port_type == "rectangular": + if self.port_radius != None: + raise ValueError('only port_height and port_width should be specified') + if self.port_height == None or self.port_width == None: + raise ValueError('port_height and port_width must be specified') + + port_cutter = paramak.PortCutterRectangular( + center_point = self.port_center_point, + height = self.port_height, + width = self.port_width, + distance = self.port_distance, + extrusion_start_offset = self.port_start_radius, + fillet_radius = self.port_fillet_radius, + azimuth_placement_angle = self.port_azimuth_placement_angle + ) + + else: + raise ValueError('invalid port_type') + + for component in args: + component.cut = [port_cutter] + component.cut + components.append(component) + + return components + + def add_thickness(x, y, thickness, dy_dx=None): """Computes outer curve points based on thickness From 3ef5e1f2d7b4465ba952d741265b7cfce151c791 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 13:10:40 +0000 Subject: [PATCH 16/38] added port arguments to constructor --- paramak/parametric_reactors/ball_reactor.py | 42 +++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index 6cae0fb92..4277f5778 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -88,6 +88,17 @@ def __init__( outboard_tf_coil_poloidal_thickness=None, divertor_position="both", rotation_angle=360.0, + port_type=None, + number_of_ports=None, + port_center_point=(0, 0), + port_radius=None, + port_height=None, + port_width=None, + port_distance=None, + port_azimuth_placement_angle=None, + port_start_radius=None, + port_fillet_radius=0, + **kwargs ): super().__init__([]) @@ -152,6 +163,37 @@ def __init__( self.plasma_gap_vertical_thickness, self.major_radius - self.minor_radius] + self.port_type = port_type + self.number_of_ports = number_of_ports + self.port_z_pos = port_z_pos + self.port_radius = port_radius + self.port_height = port_height + self.port_width = port_width + self.port_distance = port_distance + self.port_start_radius = port_start_radius + self.port_azimuth_placement_angle = port_azimuth_placement_angle + self.port_fillet_radius = port_fillet_radius + + if self.number_of_ports is not None: + if self.port_azimuth_placement_angle is None: + self.port_azimuth_placement_angle = np.linspace( + 0, 360, self.number_of_ports, endpoint=False + ) + else: + if self.number_of_ports == len(self.port_azimuth_placement_angle): + self.port_azimuth_placement_angle = port_azimuth_placement_angle + else: + raise ValueError('number of ports does not equal number of port azimuthal placement angles') + else: + if self.port_azimuth_placement_angle is not None: + self.number_of_ports = len(self.port_azimuth_placement_angle) + + self.port_start_radius = port_start_radius + + if self.port_azimuth_placement_angle is not None: + if self.port_start_radius is None: + self.port_start_radius = self.major_radius + @property def pf_coil_radial_thicknesses(self): return self._pf_coil_radial_thicknesses From 43de038356939514046845236941aba404ecf19a Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 13:12:41 +0000 Subject: [PATCH 17/38] added call to port cutting utility function --- paramak/parametric_reactors/ball_reactor.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index 4277f5778..53e7a5576 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -465,6 +465,8 @@ def _make_blankets_layers(self): cut=[self._center_column_cutter], ) + self._firstwall, self._blanket, self._blanket_rear_wall = perform_port_cutting(self, self._firstwall, self._blanket, self._blanket_rear_wall) + return [self._firstwall, self._blanket, self._blanket_rear_wall] def _make_divertor(self): From 2f72a6dbd376712d32458474a388111e0bc17239 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 13:13:30 +0000 Subject: [PATCH 18/38] added utility function import --- paramak/parametric_reactors/ball_reactor.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index 53e7a5576..54899f2f9 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -3,6 +3,8 @@ import paramak +from paramak.utils import perform_port_cutting + class BallReactor(paramak.Reactor): """Creates geometry for a simple ball reactor including a plasma, From 1d796ec83fe19bd5257615887d31813a36d57cc6 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 13:16:28 +0000 Subject: [PATCH 19/38] renamed incorrect parameter --- paramak/parametric_reactors/ball_reactor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index 54899f2f9..5ae69cd69 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -167,7 +167,7 @@ def __init__( self.port_type = port_type self.number_of_ports = number_of_ports - self.port_z_pos = port_z_pos + self.port_center_point = port_center_point self.port_radius = port_radius self.port_height = port_height self.port_width = port_width From 28278ea61d818e27ac9ac1d62d62738d8c7dba5d Mon Sep 17 00:00:00 2001 From: autopep8 Date: Thu, 3 Dec 2020 14:31:17 +0000 Subject: [PATCH 20/38] Automated autopep8 fixes --- paramak/parametric_reactors/ball_reactor.py | 9 ++-- paramak/utils.py | 48 +++++++++++---------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index 5ae69cd69..9e67ad02e 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -182,10 +182,12 @@ def __init__( 0, 360, self.number_of_ports, endpoint=False ) else: - if self.number_of_ports == len(self.port_azimuth_placement_angle): + if self.number_of_ports == len( + self.port_azimuth_placement_angle): self.port_azimuth_placement_angle = port_azimuth_placement_angle else: - raise ValueError('number of ports does not equal number of port azimuthal placement angles') + raise ValueError( + 'number of ports does not equal number of port azimuthal placement angles') else: if self.port_azimuth_placement_angle is not None: self.number_of_ports = len(self.port_azimuth_placement_angle) @@ -467,7 +469,8 @@ def _make_blankets_layers(self): cut=[self._center_column_cutter], ) - self._firstwall, self._blanket, self._blanket_rear_wall = perform_port_cutting(self, self._firstwall, self._blanket, self._blanket_rear_wall) + self._firstwall, self._blanket, self._blanket_rear_wall = perform_port_cutting( + self, self._firstwall, self._blanket, self._blanket_rear_wall) return [self._firstwall, self._blanket, self._blanket_rear_wall] diff --git a/paramak/utils.py b/paramak/utils.py index a70d0ef4a..4b1e5e8ad 100644 --- a/paramak/utils.py +++ b/paramak/utils.py @@ -212,8 +212,8 @@ def perform_port_cutting(self, *args): components = [] - if self.port_type == None and self.port_azimuth_placement_angle == None \ - and self.port_distance == None and self.port_start_radius == None: + if self.port_type is None and self.port_azimuth_placement_angle is None \ + and self.port_distance is None and self.port_start_radius is None: for component in args: components.append(component) @@ -221,42 +221,44 @@ def perform_port_cutting(self, *args): else: if self.port_type == "circular": - if self.port_height != None or self.port_width != None: + if self.port_height is not None or self.port_width is not None: raise ValueError('only port_radius should be specified') - if self.port_radius == None: + if self.port_radius is None: raise ValueError('port_radius must be specified') - + port_cutter = paramak.PortCutterCircular( - center_point = self.port_center_point, - radius = self.port_radius, - distance = self.port_distance, - extrusion_start_offset = self.port_start_radius, - azimuth_placement_angle = self.port_azimuth_placement_angle + center_point=self.port_center_point, + radius=self.port_radius, + distance=self.port_distance, + extrusion_start_offset=self.port_start_radius, + azimuth_placement_angle=self.port_azimuth_placement_angle ) elif self.port_type == "rectangular": - if self.port_radius != None: - raise ValueError('only port_height and port_width should be specified') - if self.port_height == None or self.port_width == None: - raise ValueError('port_height and port_width must be specified') + if self.port_radius is not None: + raise ValueError( + 'only port_height and port_width should be specified') + if self.port_height is None or self.port_width is None: + raise ValueError( + 'port_height and port_width must be specified') port_cutter = paramak.PortCutterRectangular( - center_point = self.port_center_point, - height = self.port_height, - width = self.port_width, - distance = self.port_distance, - extrusion_start_offset = self.port_start_radius, - fillet_radius = self.port_fillet_radius, - azimuth_placement_angle = self.port_azimuth_placement_angle + center_point=self.port_center_point, + height=self.port_height, + width=self.port_width, + distance=self.port_distance, + extrusion_start_offset=self.port_start_radius, + fillet_radius=self.port_fillet_radius, + azimuth_placement_angle=self.port_azimuth_placement_angle ) - + else: raise ValueError('invalid port_type') for component in args: component.cut = [port_cutter] + component.cut components.append(component) - + return components From aaa601f549e5d3f9b2a961dbd5c59f42a90a2424 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 14:56:12 +0000 Subject: [PATCH 21/38] updated test to use new port cutters --- .../test_parametric_components/test_VacuumVessel.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/test_parametric_components/test_VacuumVessel.py b/tests/test_parametric_components/test_VacuumVessel.py index 7026be32d..c855be8ce 100644 --- a/tests/test_parametric_components/test_VacuumVessel.py +++ b/tests/test_parametric_components/test_VacuumVessel.py @@ -22,15 +22,16 @@ def test_ports(self): caquery solid is created.""" cutter1 = paramak.PortCutterRectangular( - distance=3, z_pos=0, height=0.2, width=0.4, fillet_radius=0.01) + center_point=(0, 0), + distance=3, extrusion_start_offset=0, height=0.2, width=0.4, fillet_radius=0.01) cutter2 = paramak.PortCutterRectangular( - distance=3, z_pos=0.5, height=0.2, width=0.4, fillet_radius=0.00) + center_point=(0.5, 0), + distance=3, extrusion_start_offset=0, height=0.2, width=0.4, fillet_radius=0.00) cutter3 = paramak.PortCutterRectangular( - distance=3, z_pos=-0.5, height=0.2, width=0.4, - physical_groups=None) + distance=3, center_point=(-0.5, 0), height=0.2, width=0.4) cutter4 = paramak.PortCutterCircular( - distance=3, z_pos=0.25, radius=0.1, azimuth_placement_angle=45, - physical_groups=None) + center_point=(0.25, 0), + distance=3, extrusion_start_offset=0, radius=0.1, azimuth_placement_angle=45) cutter5 = paramak.PortCutterRotated( (0, 0), azimuth_placement_angle=-90, rotation_angle=10, fillet_radius=0.01, physical_groups=None) From 47f04c2ca07695d73e6104114f38ee36350bf37a Mon Sep 17 00:00:00 2001 From: autopep8 Date: Thu, 3 Dec 2020 14:57:03 +0000 Subject: [PATCH 22/38] Automated autopep8 fixes --- .../test_VacuumVessel.py | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/tests/test_parametric_components/test_VacuumVessel.py b/tests/test_parametric_components/test_VacuumVessel.py index c855be8ce..245d4ab4b 100644 --- a/tests/test_parametric_components/test_VacuumVessel.py +++ b/tests/test_parametric_components/test_VacuumVessel.py @@ -22,16 +22,33 @@ def test_ports(self): caquery solid is created.""" cutter1 = paramak.PortCutterRectangular( - center_point=(0, 0), - distance=3, extrusion_start_offset=0, height=0.2, width=0.4, fillet_radius=0.01) + center_point=( + 0, + 0), + distance=3, + extrusion_start_offset=0, + height=0.2, + width=0.4, + fillet_radius=0.01) cutter2 = paramak.PortCutterRectangular( - center_point=(0.5, 0), - distance=3, extrusion_start_offset=0, height=0.2, width=0.4, fillet_radius=0.00) + center_point=( + 0.5, + 0), + distance=3, + extrusion_start_offset=0, + height=0.2, + width=0.4, + fillet_radius=0.00) cutter3 = paramak.PortCutterRectangular( distance=3, center_point=(-0.5, 0), height=0.2, width=0.4) cutter4 = paramak.PortCutterCircular( - center_point=(0.25, 0), - distance=3, extrusion_start_offset=0, radius=0.1, azimuth_placement_angle=45) + center_point=( + 0.25, + 0), + distance=3, + extrusion_start_offset=0, + radius=0.1, + azimuth_placement_angle=45) cutter5 = paramak.PortCutterRotated( (0, 0), azimuth_placement_angle=-90, rotation_angle=10, fillet_radius=0.01, physical_groups=None) From 79ee675e4883511862d707baa43a67b0d1aa3dd7 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 15:18:53 +0000 Subject: [PATCH 23/38] updated examples to use new ports --- .../make_all_parametric_components.py | 4 ++-- .../make_vacuum_vessel_with_ports.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/example_parametric_components/make_all_parametric_components.py b/examples/example_parametric_components/make_all_parametric_components.py index 5348f4fec..14fd31c91 100644 --- a/examples/example_parametric_components/make_all_parametric_components.py +++ b/examples/example_parametric_components/make_all_parametric_components.py @@ -334,7 +334,7 @@ def main(): component = paramak.PortCutterRectangular( distance=3, - z_pos=0, + center_point=(0, 0), height=0.2, width=0.4, fillet_radius=0.02, @@ -344,7 +344,7 @@ def main(): component = paramak.PortCutterCircular( distance=3, - z_pos=0.25, + center_point=(0.25, 0), radius=0.1, # azimuth_placement_angle=[0, 45, 90, 180], # TODO: fix issue #548 azimuth_placement_angle=[0, 45, 90], diff --git a/examples/example_parametric_components/make_vacuum_vessel_with_ports.py b/examples/example_parametric_components/make_vacuum_vessel_with_ports.py index 9085eb41a..16b3d2b61 100644 --- a/examples/example_parametric_components/make_vacuum_vessel_with_ports.py +++ b/examples/example_parametric_components/make_vacuum_vessel_with_ports.py @@ -25,7 +25,7 @@ def main(): # makes the middle row of ports circular_ports = paramak.PortCutterCircular( distance=5, - z_pos=0, + center_point=(0, 0), radius=0.2, azimuth_placement_angle=angles_for_ports ) @@ -33,7 +33,7 @@ def main(): # makes the lower row of ports rectangular_ports = paramak.PortCutterRectangular( distance=5, - z_pos=-1, + center_point=(-1, 0), height=0.3, width=0.4, fillet_radius=0.08, From 6bba1195da6f0ed80f26849ccc0dc466ffb8a66e Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 15:54:01 +0000 Subject: [PATCH 24/38] moved point at which fillets are added to solid --- .../port_cutters_rectangular.py | 13 ++++++++++--- paramak/parametric_shapes/extruded_mixed_shape.py | 3 +++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/paramak/parametric_components/port_cutters_rectangular.py b/paramak/parametric_components/port_cutters_rectangular.py index 99efd2d52..131250602 100644 --- a/paramak/parametric_components/port_cutters_rectangular.py +++ b/paramak/parametric_components/port_cutters_rectangular.py @@ -56,7 +56,7 @@ def __init__( self.height = height self.width = width self.fillet_radius = fillet_radius - self.add_fillet() + # self.add_fillet() def find_points(self): points = [ @@ -69,6 +69,13 @@ def find_points(self): self.center_point[1]) for e in points] self.points = points - def add_fillet(self): + def add_fillet(self, solid): + if "X" not in self.workplane: + filleting_edge = "|X" + if "Y" not in self.workplane: + filleting_edge = "|Y" + if "Z" not in self.workplane: + filleting_edge = "|Z" if self.fillet_radius is not None and self.fillet_radius != 0: - self.solid = self.solid.edges().fillet(self.fillet_radius) + solid = solid.edges(filleting_edge).fillet(self.fillet_radius) + return solid diff --git a/paramak/parametric_shapes/extruded_mixed_shape.py b/paramak/parametric_shapes/extruded_mixed_shape.py index fa1cb9a7d..478e2c849 100644 --- a/paramak/parametric_shapes/extruded_mixed_shape.py +++ b/paramak/parametric_shapes/extruded_mixed_shape.py @@ -84,6 +84,9 @@ def create_solid(self): distance=extrusion_distance, both=self.extrude_both) + if hasattr(self, "add_fillet"): + solid = self.add_fillet(solid) + solid = self.rotate_solid(solid) cutting_wedge = calculate_wedge_cut(self) solid = self.perform_boolean_operations(solid, wedge_cut=cutting_wedge) From 28af7b5d673462b6a83c072c2f7ea2d035ffbc61 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 15:54:50 +0000 Subject: [PATCH 25/38] added comment --- paramak/parametric_shapes/extruded_mixed_shape.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paramak/parametric_shapes/extruded_mixed_shape.py b/paramak/parametric_shapes/extruded_mixed_shape.py index 478e2c849..b4aca24ad 100644 --- a/paramak/parametric_shapes/extruded_mixed_shape.py +++ b/paramak/parametric_shapes/extruded_mixed_shape.py @@ -84,6 +84,8 @@ def create_solid(self): distance=extrusion_distance, both=self.extrude_both) + # used for filleting rectangular port cutter edges + # must be done before azimuthal placement if hasattr(self, "add_fillet"): solid = self.add_fillet(solid) From ce11a96f3c594bc71b7e8a6276db3455c7d79a20 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Thu, 3 Dec 2020 16:05:54 +0000 Subject: [PATCH 26/38] added numpy to imports --- paramak/parametric_reactors/ball_reactor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index 9e67ad02e..b2e6ebb24 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -1,4 +1,5 @@ +import numpy as np import warnings import paramak From 5f8040c3efd94b0395762a50661350020d2cb426 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 09:25:10 +0000 Subject: [PATCH 27/38] added port parameters to construction --- .../parametric_reactors/submersion_reactor.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/paramak/parametric_reactors/submersion_reactor.py b/paramak/parametric_reactors/submersion_reactor.py index 4496f05fb..e0a140229 100644 --- a/paramak/parametric_reactors/submersion_reactor.py +++ b/paramak/parametric_reactors/submersion_reactor.py @@ -90,6 +90,17 @@ def __init__( pf_coil_case_thickness=10, divertor_position="both", support_position="both", + port_type=None, + number_of_ports=None, + port_center_point=(0, 0), + port_radius=None, + port_height=None, + port_width=None, + port_distance=None, + port_azimuth_placement_angle=None, + port_start_radius=None, + port_fillet_radius=0, + **kwargs ): super().__init__([]) @@ -147,6 +158,39 @@ def __init__( (outer_equatorial_point + inner_equatorial_point) / 2 self.minor_radius = self.major_radius - inner_equatorial_point + self.port_type = port_type + self.number_of_ports = number_of_ports + self.port_center_point = port_center_point + self.port_radius = port_radius + self.port_height = port_height + self.port_width = port_width + self.port_distance = port_distance + self.port_start_radius = port_start_radius + self.port_azimuth_placement_angle = port_azimuth_placement_angle + self.port_fillet_radius = port_fillet_radius + + if self.number_of_ports is not None: + if self.port_azimuth_placement_angle is None: + self.port_azimuth_placement_angle = np.linspace( + 0, 360, self.number_of_ports, endpoint=False + ) + else: + if self.number_of_ports == len( + self.port_azimuth_placement_angle): + self.port_azimuth_placement_angle = port_azimuth_placement_angle + else: + raise ValueError( + 'number of ports does not equal number of port azimuthal placement angles') + else: + if self.port_azimuth_placement_angle is not None: + self.number_of_ports = len(self.port_azimuth_placement_angle) + + self.port_start_radius = port_start_radius + + if self.port_azimuth_placement_angle is not None: + if self.port_start_radius is None: + self.port_start_radius = self.major_radius + @property def pf_coil_radial_thicknesses(self): return self._pf_coil_radial_thicknesses From dc525a2c7ed4a20318ba66f1da0e34a67011bfdd Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 09:53:52 +0000 Subject: [PATCH 28/38] updated port cutting method to accept one shape and shapes with no cuts already --- paramak/utils.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/paramak/utils.py b/paramak/utils.py index 4b1e5e8ad..ae1f1bcd8 100644 --- a/paramak/utils.py +++ b/paramak/utils.py @@ -256,9 +256,13 @@ def perform_port_cutting(self, *args): raise ValueError('invalid port_type') for component in args: - component.cut = [port_cutter] + component.cut + if component.cut is None: + component.cut = [port_cutter] + else: + component.cut = [port_cutter] + component.cut components.append(component) - + if len(args) == 1: + return component return components From adbef3736c22d614a58602a1660492ffaf74166c Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 09:54:16 +0000 Subject: [PATCH 29/38] added port cutting to submersion reactor --- paramak/parametric_reactors/submersion_reactor.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/paramak/parametric_reactors/submersion_reactor.py b/paramak/parametric_reactors/submersion_reactor.py index e0a140229..0332fc0f8 100644 --- a/paramak/parametric_reactors/submersion_reactor.py +++ b/paramak/parametric_reactors/submersion_reactor.py @@ -4,6 +4,8 @@ import cadquery as cq import paramak +from paramak.utils import perform_port_cutting + class SubmersionTokamak(paramak.Reactor): """Creates geometry for a simple submersion reactor including a plasma, @@ -490,6 +492,7 @@ def _make_firstwall(self): material_tag="firstwall_mat", union=self._inboard_firstwall, ) + self._firstwall = perform_port_cutting(self, self._firstwall) return self._firstwall def _make_divertor(self): @@ -539,8 +542,7 @@ def _make_divertor(self): name="divertor", material_tag="divertor_mat" ) - - self._firstwall.cut = self._divertor + self._firstwall.cut = self._firstwall.cut + [self._divertor] self._inboard_firstwall.cut = self._divertor return self._divertor @@ -575,6 +577,7 @@ def _make_blanket(self): material_tag="blanket_mat", union=self._inboard_blanket, ) + self._blanket = perform_port_cutting(self, self._blanket) return self._blanket def _make_supports(self): @@ -611,7 +614,7 @@ def _make_supports(self): material_tag="supports_mat", intersect=blanket_enveloppe, ) - self._blanket.cut = self._supports + self._blanket.cut = self._blanket.cut + [self._supports] return self._supports @@ -678,6 +681,8 @@ def _make_rear_blanket_wall(self): self._outboard_rear_blanket_wall_lower], ) + self._outboard_rear_blanket_wall = perform_port_cutting(self, self._outboard_rear_blanket_wall) + return self._outboard_rear_blanket_wall def _make_coils(self): From 177f1f2a4805cb26a99b834dee9948dd06b4772c Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 09:59:44 +0000 Subject: [PATCH 30/38] updated docstring --- paramak/parametric_components/port_cutters_circular.py | 2 +- paramak/parametric_components/port_cutters_rectangular.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paramak/parametric_components/port_cutters_circular.py b/paramak/parametric_components/port_cutters_circular.py index 340df2bba..096f26181 100644 --- a/paramak/parametric_components/port_cutters_circular.py +++ b/paramak/parametric_components/port_cutters_circular.py @@ -7,7 +7,7 @@ class PortCutterCircular(ExtrudeCircleShape): other components (eg. blanket, vessel,..) in order to create ports. Args: - center_point (tuple of floats): Defaults to (0, 0). + center_point ((float, float)): Defaults to (0, 0). radius (float): radius (cm) of port. distance (float): extruded distance (cm) of the cutter. stp_filename (str, optional): defaults to "PortCutterCircular.stp". diff --git a/paramak/parametric_components/port_cutters_rectangular.py b/paramak/parametric_components/port_cutters_rectangular.py index 131250602..8932d49b6 100644 --- a/paramak/parametric_components/port_cutters_rectangular.py +++ b/paramak/parametric_components/port_cutters_rectangular.py @@ -7,7 +7,7 @@ class PortCutterRectangular(ExtrudeStraightShape): other components (eg. blanket, vessel,..) in order to create ports. Args: - center_point (tuple of floats): Defaults to (0, 0). + center_point ((float, float)): Defaults to (0, 0). height (float): height (cm) of the port. width (float): width (cm) of the port. distance (float): extruded distance (cm) of the cutter. From 262494890b51062d3ae1fa248bdc28e1f69b996b Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 10:01:48 +0000 Subject: [PATCH 31/38] using insert instead of list concatenation --- paramak/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paramak/utils.py b/paramak/utils.py index ae1f1bcd8..dff9d3928 100644 --- a/paramak/utils.py +++ b/paramak/utils.py @@ -259,7 +259,7 @@ def perform_port_cutting(self, *args): if component.cut is None: component.cut = [port_cutter] else: - component.cut = [port_cutter] + component.cut + component.cut.insert(0, port_cutter) components.append(component) if len(args) == 1: return component From ad592cca054d59eb70328d9c948f02aee2247b33 Mon Sep 17 00:00:00 2001 From: autopep8 Date: Fri, 4 Dec 2020 10:08:20 +0000 Subject: [PATCH 32/38] Automated autopep8 fixes --- paramak/parametric_reactors/submersion_reactor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/paramak/parametric_reactors/submersion_reactor.py b/paramak/parametric_reactors/submersion_reactor.py index 0332fc0f8..0cfa17dbd 100644 --- a/paramak/parametric_reactors/submersion_reactor.py +++ b/paramak/parametric_reactors/submersion_reactor.py @@ -681,7 +681,8 @@ def _make_rear_blanket_wall(self): self._outboard_rear_blanket_wall_lower], ) - self._outboard_rear_blanket_wall = perform_port_cutting(self, self._outboard_rear_blanket_wall) + self._outboard_rear_blanket_wall = perform_port_cutting( + self, self._outboard_rear_blanket_wall) return self._outboard_rear_blanket_wall From 82f6a232423844ac67c396e049fef662d5102ee6 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 10:28:36 +0000 Subject: [PATCH 33/38] added docstrings for port parameters --- paramak/parametric_reactors/ball_reactor.py | 25 +++++++++++++++++-- .../parametric_reactors/submersion_reactor.py | 22 ++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index b2e6ebb24..a83c7ce33 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -64,6 +64,28 @@ class BallReactor(paramak.Reactor): "upper", "lower" or "both". Defaults to "both". rotation_angle (float): the angle of the sector that is desired. Defaults to 360.0. + port_type (str, optional): type of port to be cut. Defaults to None. + number_of_ports (int, optional): number of ports. Defaults to None. + port_center_point ((float, float), optional): position of port center + point in the workplane given. Defaults to (0, 0). + port_radius (float, optional): radius of circular ports. Defaults to + None. + port_height (float, optional): height of rectangular ports. Defaults + to None. + port_width (float, optional): width of rectangular ports. Defaults to + None. + port_distance (float, optional): extrusion distance of port cutter. + Defaults to None. + port_azimuth_placement_angle (float or list of floats, optional): + azimuthal placement of each port. Defualts to None if no ports + are created. Defaults to list of equally spaced floats between 0 + and 360 of length equal to number_of_ports if number_of_ports is + provided but port_azimuth_placement_angle is not. + port_start_radius (float, optional): extrusion start point of port + cutter. Defaults to None if no ports are created. Defaults to + major_radius otherwise. + port_fillet_radius (float, optional): fillet radius of rectangular + ports. Defaults to 0. """ def __init__( @@ -470,8 +492,7 @@ def _make_blankets_layers(self): cut=[self._center_column_cutter], ) - self._firstwall, self._blanket, self._blanket_rear_wall = perform_port_cutting( - self, self._firstwall, self._blanket, self._blanket_rear_wall) + self._firstwall, self._blanket, self._blanket_rear_wall = perform_port_cutting(self, self._firstwall, self._blanket, self._blanket_rear_wall) return [self._firstwall, self._blanket, self._blanket_rear_wall] diff --git a/paramak/parametric_reactors/submersion_reactor.py b/paramak/parametric_reactors/submersion_reactor.py index 0332fc0f8..44dd1c7b5 100644 --- a/paramak/parametric_reactors/submersion_reactor.py +++ b/paramak/parametric_reactors/submersion_reactor.py @@ -63,6 +63,28 @@ class SubmersionTokamak(paramak.Reactor): "upper", "lower" or "both". Defaults to "both". support_position (str, optional): the position of the supports, "upper", "lower" or "both". Defaults to "both". + port_type (str, optional): type of port to be cut. Defaults to None. + number_of_ports (int, optional): number of ports. Defaults to None. + port_center_point ((float, float), optional): position of port center + point in the workplane given. Defaults to (0, 0). + port_radius (float, optional): radius of circular ports. Defaults to + None. + port_height (float, optional): height of rectangular ports. Defaults + to None. + port_width (float, optional): width of rectangular ports. Defaults to + None. + port_distance (float, optional): extrusion distance of port cutter. + Defaults to None. + port_azimuth_placement_angle (float or list of floats, optional): + azimuthal placement of each port. Defualts to None if no ports + are created. Defaults to list of equally spaced floats between 0 + and 360 of length equal to number_of_ports if number_of_ports is + provided but port_azimuth_placement_angle is not. + port_start_radius (float, optional): extrusion start point of port + cutter. Defaults to None if no ports are created. Defaults to + major_radius otherwise. + port_fillet_radius (float, optional): fillet radius of rectangular + ports. Defaults to 0. """ def __init__( From c12e2ccf8b632c6f906dbcbb6633992318cf6300 Mon Sep 17 00:00:00 2001 From: autopep8 Date: Fri, 4 Dec 2020 10:29:47 +0000 Subject: [PATCH 34/38] Automated autopep8 fixes --- paramak/parametric_reactors/ball_reactor.py | 7 ++++--- paramak/parametric_reactors/submersion_reactor.py | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index a83c7ce33..03571e33c 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -68,7 +68,7 @@ class BallReactor(paramak.Reactor): number_of_ports (int, optional): number of ports. Defaults to None. port_center_point ((float, float), optional): position of port center point in the workplane given. Defaults to (0, 0). - port_radius (float, optional): radius of circular ports. Defaults to + port_radius (float, optional): radius of circular ports. Defaults to None. port_height (float, optional): height of rectangular ports. Defaults to None. @@ -76,7 +76,7 @@ class BallReactor(paramak.Reactor): None. port_distance (float, optional): extrusion distance of port cutter. Defaults to None. - port_azimuth_placement_angle (float or list of floats, optional): + port_azimuth_placement_angle (float or list of floats, optional): azimuthal placement of each port. Defualts to None if no ports are created. Defaults to list of equally spaced floats between 0 and 360 of length equal to number_of_ports if number_of_ports is @@ -492,7 +492,8 @@ def _make_blankets_layers(self): cut=[self._center_column_cutter], ) - self._firstwall, self._blanket, self._blanket_rear_wall = perform_port_cutting(self, self._firstwall, self._blanket, self._blanket_rear_wall) + self._firstwall, self._blanket, self._blanket_rear_wall = perform_port_cutting( + self, self._firstwall, self._blanket, self._blanket_rear_wall) return [self._firstwall, self._blanket, self._blanket_rear_wall] diff --git a/paramak/parametric_reactors/submersion_reactor.py b/paramak/parametric_reactors/submersion_reactor.py index dfb2e180f..2d4c4c658 100644 --- a/paramak/parametric_reactors/submersion_reactor.py +++ b/paramak/parametric_reactors/submersion_reactor.py @@ -67,7 +67,7 @@ class SubmersionTokamak(paramak.Reactor): number_of_ports (int, optional): number of ports. Defaults to None. port_center_point ((float, float), optional): position of port center point in the workplane given. Defaults to (0, 0). - port_radius (float, optional): radius of circular ports. Defaults to + port_radius (float, optional): radius of circular ports. Defaults to None. port_height (float, optional): height of rectangular ports. Defaults to None. @@ -75,7 +75,7 @@ class SubmersionTokamak(paramak.Reactor): None. port_distance (float, optional): extrusion distance of port cutter. Defaults to None. - port_azimuth_placement_angle (float or list of floats, optional): + port_azimuth_placement_angle (float or list of floats, optional): azimuthal placement of each port. Defualts to None if no ports are created. Defaults to list of equally spaced floats between 0 and 360 of length equal to number_of_ports if number_of_ports is From c4a6346766fdedb3b969a467b233e3996dcf12a0 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 11:22:39 +0000 Subject: [PATCH 35/38] fixed adding cuts to shapes --- paramak/parametric_reactors/submersion_reactor.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/paramak/parametric_reactors/submersion_reactor.py b/paramak/parametric_reactors/submersion_reactor.py index 2d4c4c658..519c2a1cf 100644 --- a/paramak/parametric_reactors/submersion_reactor.py +++ b/paramak/parametric_reactors/submersion_reactor.py @@ -564,7 +564,10 @@ def _make_divertor(self): name="divertor", material_tag="divertor_mat" ) - self._firstwall.cut = self._firstwall.cut + [self._divertor] + if self._firstwall.cut is None: + self._firstwall.cut = [self._divertor] + else: + self._firstwall.cut = self._firstwall.cut + [self._divertor] self._inboard_firstwall.cut = self._divertor return self._divertor @@ -636,7 +639,10 @@ def _make_supports(self): material_tag="supports_mat", intersect=blanket_enveloppe, ) - self._blanket.cut = self._blanket.cut + [self._supports] + if self._blanket.cut is None: + self._blanket.cut = [self._supports] + else: + self._blanket.cut = self._blanket.cut + [self._supports] return self._supports From ff008607eb3ed083c409b8a364a2f193ad6fe574 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 11:23:08 +0000 Subject: [PATCH 36/38] fixed port cutter shape returning --- paramak/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paramak/utils.py b/paramak/utils.py index dff9d3928..7c13a45a0 100644 --- a/paramak/utils.py +++ b/paramak/utils.py @@ -217,6 +217,8 @@ def perform_port_cutting(self, *args): for component in args: components.append(component) + if len(args) == 1: + return component return components else: From 860636cbdeec12a32f99232448628eeef234a61c Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 12:31:54 +0000 Subject: [PATCH 37/38] removed number_of_ports as argument --- paramak/parametric_reactors/ball_reactor.py | 35 ++++++------------- .../parametric_reactors/submersion_reactor.py | 32 +++++------------ 2 files changed, 19 insertions(+), 48 deletions(-) diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py index 03571e33c..4469ffa80 100644 --- a/paramak/parametric_reactors/ball_reactor.py +++ b/paramak/parametric_reactors/ball_reactor.py @@ -65,7 +65,6 @@ class BallReactor(paramak.Reactor): rotation_angle (float): the angle of the sector that is desired. Defaults to 360.0. port_type (str, optional): type of port to be cut. Defaults to None. - number_of_ports (int, optional): number of ports. Defaults to None. port_center_point ((float, float), optional): position of port center point in the workplane given. Defaults to (0, 0). port_radius (float, optional): radius of circular ports. Defaults to @@ -82,8 +81,7 @@ class BallReactor(paramak.Reactor): and 360 of length equal to number_of_ports if number_of_ports is provided but port_azimuth_placement_angle is not. port_start_radius (float, optional): extrusion start point of port - cutter. Defaults to None if no ports are created. Defaults to - major_radius otherwise. + cutter. Defaults to major_radius. port_fillet_radius (float, optional): fillet radius of rectangular ports. Defaults to 0. """ @@ -114,7 +112,6 @@ def __init__( divertor_position="both", rotation_angle=360.0, port_type=None, - number_of_ports=None, port_center_point=(0, 0), port_radius=None, port_height=None, @@ -189,7 +186,6 @@ def __init__( self.major_radius - self.minor_radius] self.port_type = port_type - self.number_of_ports = number_of_ports self.port_center_point = port_center_point self.port_radius = port_radius self.port_height = port_height @@ -199,27 +195,16 @@ def __init__( self.port_azimuth_placement_angle = port_azimuth_placement_angle self.port_fillet_radius = port_fillet_radius - if self.number_of_ports is not None: - if self.port_azimuth_placement_angle is None: - self.port_azimuth_placement_angle = np.linspace( - 0, 360, self.number_of_ports, endpoint=False - ) - else: - if self.number_of_ports == len( - self.port_azimuth_placement_angle): - self.port_azimuth_placement_angle = port_azimuth_placement_angle - else: - raise ValueError( - 'number of ports does not equal number of port azimuthal placement angles') - else: - if self.port_azimuth_placement_angle is not None: - self.number_of_ports = len(self.port_azimuth_placement_angle) - - self.port_start_radius = port_start_radius + @property + def port_start_radius(self): + return self._port_start_radius - if self.port_azimuth_placement_angle is not None: - if self.port_start_radius is None: - self.port_start_radius = self.major_radius + @port_start_radius.setter + def port_start_radius(self, value): + if value is None: + self._port_start_radius = self.major_radius + else: + self._port_start_radius = value @property def pf_coil_radial_thicknesses(self): diff --git a/paramak/parametric_reactors/submersion_reactor.py b/paramak/parametric_reactors/submersion_reactor.py index 519c2a1cf..7a3875d96 100644 --- a/paramak/parametric_reactors/submersion_reactor.py +++ b/paramak/parametric_reactors/submersion_reactor.py @@ -64,7 +64,6 @@ class SubmersionTokamak(paramak.Reactor): support_position (str, optional): the position of the supports, "upper", "lower" or "both". Defaults to "both". port_type (str, optional): type of port to be cut. Defaults to None. - number_of_ports (int, optional): number of ports. Defaults to None. port_center_point ((float, float), optional): position of port center point in the workplane given. Defaults to (0, 0). port_radius (float, optional): radius of circular ports. Defaults to @@ -115,7 +114,6 @@ def __init__( divertor_position="both", support_position="both", port_type=None, - number_of_ports=None, port_center_point=(0, 0), port_radius=None, port_height=None, @@ -183,7 +181,6 @@ def __init__( self.minor_radius = self.major_radius - inner_equatorial_point self.port_type = port_type - self.number_of_ports = number_of_ports self.port_center_point = port_center_point self.port_radius = port_radius self.port_height = port_height @@ -193,27 +190,16 @@ def __init__( self.port_azimuth_placement_angle = port_azimuth_placement_angle self.port_fillet_radius = port_fillet_radius - if self.number_of_ports is not None: - if self.port_azimuth_placement_angle is None: - self.port_azimuth_placement_angle = np.linspace( - 0, 360, self.number_of_ports, endpoint=False - ) - else: - if self.number_of_ports == len( - self.port_azimuth_placement_angle): - self.port_azimuth_placement_angle = port_azimuth_placement_angle - else: - raise ValueError( - 'number of ports does not equal number of port azimuthal placement angles') - else: - if self.port_azimuth_placement_angle is not None: - self.number_of_ports = len(self.port_azimuth_placement_angle) - - self.port_start_radius = port_start_radius + @property + def port_start_radius(self): + return self._port_start_radius - if self.port_azimuth_placement_angle is not None: - if self.port_start_radius is None: - self.port_start_radius = self.major_radius + @port_start_radius.setter + def port_start_radius(self, value): + if value is None: + self._port_start_radius = self.major_radius + else: + self._port_start_radius = value @property def pf_coil_radial_thicknesses(self): From 524fa33a0ca2da4515a1f77b513f3c1ca82061e7 Mon Sep 17 00:00:00 2001 From: billingsley-john Date: Fri, 4 Dec 2020 12:43:30 +0000 Subject: [PATCH 38/38] updated condition for port cutting --- paramak/utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/paramak/utils.py b/paramak/utils.py index 7c13a45a0..17724fda3 100644 --- a/paramak/utils.py +++ b/paramak/utils.py @@ -212,8 +212,7 @@ def perform_port_cutting(self, *args): components = [] - if self.port_type is None and self.port_azimuth_placement_angle is None \ - and self.port_distance is None and self.port_start_radius is None: + if self.port_type is None: for component in args: components.append(component)