From ebc62bc0d1906973a9cb5f8fef5eb8df00c0c229 Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 07:27:28 +0100 Subject: [PATCH 01/11] fixed example --- _unittest/test_22_Circuit_DynamicLink.py | 1 + examples/06-Multiphysics/Hfss_Mechanical.py | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/_unittest/test_22_Circuit_DynamicLink.py b/_unittest/test_22_Circuit_DynamicLink.py index d222911f196..844b1f386c2 100644 --- a/_unittest/test_22_Circuit_DynamicLink.py +++ b/_unittest/test_22_Circuit_DynamicLink.py @@ -189,6 +189,7 @@ def test_09_setup(self): assert LNA_setup.update() def test_10_q3d_link(self): + print("Started Test 10") self.aedtapp.insert_design("test_link") assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( "2DExtractorDesign1", self.q3d, solution_name="Setup1 : Sweep", extrusion_length=25 diff --git a/examples/06-Multiphysics/Hfss_Mechanical.py b/examples/06-Multiphysics/Hfss_Mechanical.py index 46faa26ebff..858b6a734b1 100644 --- a/examples/06-Multiphysics/Hfss_Mechanical.py +++ b/examples/06-Multiphysics/Hfss_Mechanical.py @@ -33,19 +33,19 @@ # Starts HFSS # ~~~~~~~~~~~ # Starts Hfss and initialize the Pyaedt object. - +non_graphical = True version = "2021.2" -hfss = Hfss(project_temp_name, specified_version=version) +hfss = Hfss(project_temp_name, specified_version=version, non_graphical=non_graphical) pin_names = hfss.modeler.get_excitations_name() - ############################################################################### # Starts Circuit # ~~~~~~~~~~~~~~ # Starts Circuit and add Hfss dynamic link component to it. circuit = Circuit() -hfss_comp = circuit.modeler.schematic.add_subcircuit_dynamic_link(hfss) +hfss_comp = circuit.modeler.schematic.add_subcircuit_dynamic_link(hfss.design_name, hfss.project_file, + hfss.nominal_sweep) ############################################################################### # Dynamic Link Options @@ -54,7 +54,7 @@ # argument of set_sim_option_on_hfss_subcircuit can be the component name, the component id or # the component object. -circuit.modeler.schematic.refresh_dynamic_link("MyHfss") +circuit.modeler.schematic.refresh_dynamic_link(hfss.design_name) circuit.modeler.schematic.set_sim_option_on_hfss_subcircuit(hfss_comp) hfss_setup_name = hfss.setups[0].name + " : " + hfss.setups[0].sweeps[0].name circuit.modeler.schematic.set_sim_solution_on_hfss_subcircuit(hfss_comp.composed_name, hfss_setup_name) From 02e8d21d3b225aa91eaee7e284cdb8bd004c7a5c Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 07:45:48 +0100 Subject: [PATCH 02/11] fixed example --- _unittest/test_22_Circuit_DynamicLink.py | 2 +- pyaedt/modeler/PrimitivesNexxim.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/_unittest/test_22_Circuit_DynamicLink.py b/_unittest/test_22_Circuit_DynamicLink.py index 844b1f386c2..98f7fb532e2 100644 --- a/_unittest/test_22_Circuit_DynamicLink.py +++ b/_unittest/test_22_Circuit_DynamicLink.py @@ -30,7 +30,7 @@ def setup_class(self): source_project = os.path.join(local_path, "example_models", src_project_name + ".aedt") linked_project = os.path.join(local_path, "example_models", linked_project_name + ".aedt") - self.q3d = os.path.join(local_path, "example_models", "q2d_q3d.aedt") + self.q3d = self.local_scratch.copyfile(os.path.join(local_path, "example_models", "q2d_q3d.aedt")) self.test_project = self.local_scratch.copyfile(example_project) self.test_src_project = self.local_scratch.copyfile(source_project) self.test_lkd_project = self.local_scratch.copyfile(linked_project) diff --git a/pyaedt/modeler/PrimitivesNexxim.py b/pyaedt/modeler/PrimitivesNexxim.py index 9ebd1fca434..4bb1832b245 100644 --- a/pyaedt/modeler/PrimitivesNexxim.py +++ b/pyaedt/modeler/PrimitivesNexxim.py @@ -1626,6 +1626,9 @@ def refresh_dynamic_link(self, component_name): >>> oComponentManager.UpdateDynamicLink """ + if "@" in component_name: + component_name = component_name.split("@")[1] + component_name = component_name.split(";")[0] self.o_component_manager.UpdateDynamicLink(component_name) return True From ce15d67919ed0c5f3469afb88efaed6293c51d34 Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 07:46:49 +0100 Subject: [PATCH 03/11] fixed example --- _unittest/test_22_Circuit_DynamicLink.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/_unittest/test_22_Circuit_DynamicLink.py b/_unittest/test_22_Circuit_DynamicLink.py index 98f7fb532e2..e56187317b7 100644 --- a/_unittest/test_22_Circuit_DynamicLink.py +++ b/_unittest/test_22_Circuit_DynamicLink.py @@ -194,12 +194,20 @@ def test_10_q3d_link(self): assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( "2DExtractorDesign1", self.q3d, solution_name="Setup1 : Sweep", extrusion_length=25 ) + print("Started Test 10") + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( "Q3DDesign1", self.q3d, solution_name="Setup1 : LastAdaptive" ) + print("Started Test 10") + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( "Terminal", self.q3d, solution_name="Setup1 : Sweep" ) + print("Started Test 10") + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( "Terminal", self.q3d, solution_name="Setup2 : Sweep", tline_port="1" ) + print("Started Test 10") + From 0a52ad98ddb7cd953e159473d4922aa121e1b823 Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 09:28:17 +0100 Subject: [PATCH 04/11] fixed example --- _unittest/test_00_EDB.py | 1 + _unittest/test_22_Circuit_DynamicLink.py | 16 ++--- pyaedt/modeler/PrimitivesNexxim.py | 86 +++++++++++++++++++----- 3 files changed, 79 insertions(+), 24 deletions(-) diff --git a/_unittest/test_00_EDB.py b/_unittest/test_00_EDB.py index cd0ba7e6cc6..902e22f2bc1 100644 --- a/_unittest/test_00_EDB.py +++ b/_unittest/test_00_EDB.py @@ -68,6 +68,7 @@ def test_02_get_properties(self): assert len(self.edbapp.core_components.ICs) > 0 assert len(self.edbapp.core_components.IOs) > 0 assert len(self.edbapp.core_components.Others) > 0 + assert len(self.edbapp.get_bounding_box()) == 2 def test_03_get_primitives(self): assert len(self.edbapp.core_primitives.polygons) > 0 diff --git a/_unittest/test_22_Circuit_DynamicLink.py b/_unittest/test_22_Circuit_DynamicLink.py index e56187317b7..efca8076d39 100644 --- a/_unittest/test_22_Circuit_DynamicLink.py +++ b/_unittest/test_22_Circuit_DynamicLink.py @@ -2,7 +2,7 @@ import os from _unittest.conftest import local_path, scratch_path, config, desktop_version -from pyaedt import Circuit +from pyaedt import Circuit, Q2d, Q3d, Hfss from pyaedt.generic.filesystem import Scratch import gc @@ -191,23 +191,23 @@ def test_09_setup(self): def test_10_q3d_link(self): print("Started Test 10") self.aedtapp.insert_design("test_link") + q2d = Q2d(self.q3d) assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( - "2DExtractorDesign1", self.q3d, solution_name="Setup1 : Sweep", extrusion_length=25 + q2d, extrusion_length=25 ) print("Started Test 10") - + q3d = Q3d() assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( - "Q3DDesign1", self.q3d, solution_name="Setup1 : LastAdaptive" + q3d, solution_name="Setup1 : LastAdaptive" ) print("Started Test 10") + hfss = Hfss() - assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( - "Terminal", self.q3d, solution_name="Setup1 : Sweep" + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup1 : Sweep" ) print("Started Test 10") - assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( - "Terminal", self.q3d, solution_name="Setup2 : Sweep", tline_port="1" + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup2 : Sweep", tline_port="1" ) print("Started Test 10") diff --git a/pyaedt/modeler/PrimitivesNexxim.py b/pyaedt/modeler/PrimitivesNexxim.py index 4bb1832b245..3bd2e08d256 100644 --- a/pyaedt/modeler/PrimitivesNexxim.py +++ b/pyaedt/modeler/PrimitivesNexxim.py @@ -1173,12 +1173,11 @@ def add_subcircuit_hfss_link( @aedt_exception_handler def add_subcircuit_dynamic_link( self, - source_design_name, - source_project_path, - solution_name, + pyaedt_app, + solution_name=None, extrusion_length=None, enable_cable_modeling=True, - default_matrix="", + default_matrix="Original", tline_port="", ): """Add a subcircuit from `HFSS`, `Q3d` or `2D Extractor` in circuit design. @@ -1213,18 +1212,71 @@ def add_subcircuit_dynamic_link( >>> oDesign.AddCompInstance >>> oDesign.AddDynamicLink """ - comp_name = generate_unique_name(source_design_name) - self._app.odesign.AddDynamicLink( - source_design_name, - source_project_path, - comp_name, - solution_name, - tline_port, - default_matrix, - enable_cable_modeling, - "Pyaedt Dynamic Link", + comp_name = generate_unique_name(pyaedt_app.design_name) + source_project_path = pyaedt_app.project_file + source_design_name = pyaedt_app.design_name + matrix = None + if pyaedt_app.design_type == "HFSS": + pin_names = pyaedt_app.get_excitations_name() + elif pyaedt_app.design_type == "Q3D Extractor": + excts = list(pyaedt_app.oboundary.GetExcitations()) + i = 0 + sources = [] + sinks = [] + while i < len(excts): + if excts[i + 1] == "Source": + sources.append(excts[i]) + elif excts[i + 1] == "Sink": + sinks.append(excts[i]) + i += 2 + pin_names = sources + sinks + matrix = ["NAME:Reduce Matrix Choices"] + list(pyaedt_app.omatrix.ListReduceMatrixes()) + elif pyaedt_app.design_type == "2D Extractor": + excts = list(pyaedt_app.oboundary.GetExcitations()) + pins = [] + i = 0 + while i < len(excts): + if excts[i + 1] != "ReferenceGround": + pins.append(excts[i]) + i += 2 + pin_names = [i + "_in" for i in pins] + pin_names.append("Input_ref") + pin_names.extend([i + "_out" for i in pins]) + pin_names.append("Output_ref") + matrix = ["NAME:Reduce Matrix Choices"] + list(pyaedt_app.omatrix.ListReduceMatrixes()) + variables = {} + for k, v in pyaedt_app.variable_manager.variables.items(): + variables[k] = v.string_value + if not solution_name: + solution_name = pyaedt_app.nominal_sweep + comp = self._add_subcircuit_link( + comp_name=comp_name, + pin_names=pin_names, + source_project_path=source_project_path, + source_design_name=source_design_name, + solution_name=solution_name, + image_subcircuit_path="", + model_type=pyaedt_app.design_type, + variables=variables, + extrusion_length_q2d=extrusion_length, + matrix=matrix, + enable_cable_modeling=enable_cable_modeling, + default_matrix=default_matrix, ) + + # + # + # self._app.odesign.AddDynamicLink( + # source_design_name, + # source_project_path, + # comp_name, + # solution_name, + # tline_port, + # default_matrix, + # enable_cable_modeling, + # "Pyaedt Dynamic Link", + # ) self.refresh_all_ids() for el in self.components: if comp_name in self.components[el].composed_name: @@ -1248,6 +1300,8 @@ def _add_subcircuit_link( variables=None, extrusion_length_q2d=10, matrix=None, + enable_cable_modeling=False, + default_matrix="Original" ): """Add a subcircuit HFSS link. @@ -1395,12 +1449,12 @@ def _add_subcircuit_link( ] ) if not matrix: - matrix = ["NAME:Reduce Matrix Choices", "Original"] + matrix = ["NAME:Reduce Matrix Choices", default_matrix] compInfo.extend(["Reduce Matrix:=", "Original", matrix]) else: if not matrix: matrix = ["NAME:Reduce Matrix Choices", "Original"] - compInfo.extend(["Reduce Matrix:=", "Original", matrix, "EnableCableModeling:=", False]) + compInfo.extend(["Reduce Matrix:=", default_matrix, matrix, "EnableCableModeling:=", enable_cable_modeling]) self.o_model_manager.Add(compInfo) From 5b406558aa70420b50b253f2eab8957ac73f313c Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 10:04:26 +0100 Subject: [PATCH 05/11] fixed example --- _unittest/test_22_Circuit_DynamicLink.py | 8 ++++++-- examples/06-Multiphysics/Hfss_Mechanical.py | 3 +-- pyaedt/modeler/PrimitivesNexxim.py | 14 +++++++------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/_unittest/test_22_Circuit_DynamicLink.py b/_unittest/test_22_Circuit_DynamicLink.py index efca8076d39..f7fdd1d2bb3 100644 --- a/_unittest/test_22_Circuit_DynamicLink.py +++ b/_unittest/test_22_Circuit_DynamicLink.py @@ -192,16 +192,20 @@ def test_10_q3d_link(self): print("Started Test 10") self.aedtapp.insert_design("test_link") q2d = Q2d(self.q3d) + proj_path = self.q3d + proj_name = q2d.project_name assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( q2d, extrusion_length=25 ) + if proj_name in self.aedtapp.project_list: + proj_path = proj_name print("Started Test 10") - q3d = Q3d() + q3d = Q3d(proj_path) assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( q3d, solution_name="Setup1 : LastAdaptive" ) print("Started Test 10") - hfss = Hfss() + hfss = Hfss(proj_path) assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup1 : Sweep" ) diff --git a/examples/06-Multiphysics/Hfss_Mechanical.py b/examples/06-Multiphysics/Hfss_Mechanical.py index 858b6a734b1..20883b331fd 100644 --- a/examples/06-Multiphysics/Hfss_Mechanical.py +++ b/examples/06-Multiphysics/Hfss_Mechanical.py @@ -44,8 +44,7 @@ # Starts Circuit and add Hfss dynamic link component to it. circuit = Circuit() -hfss_comp = circuit.modeler.schematic.add_subcircuit_dynamic_link(hfss.design_name, hfss.project_file, - hfss.nominal_sweep) +hfss_comp = circuit.modeler.schematic.add_subcircuit_dynamic_link(hfss) ############################################################################### # Dynamic Link Options diff --git a/pyaedt/modeler/PrimitivesNexxim.py b/pyaedt/modeler/PrimitivesNexxim.py index 3bd2e08d256..08dc9052a25 100644 --- a/pyaedt/modeler/PrimitivesNexxim.py +++ b/pyaedt/modeler/PrimitivesNexxim.py @@ -1179,15 +1179,14 @@ def add_subcircuit_dynamic_link( enable_cable_modeling=True, default_matrix="Original", tline_port="", + comp_name=None, ): """Add a subcircuit from `HFSS`, `Q3d` or `2D Extractor` in circuit design. Parameters ---------- - source_design_name : str - Source Project Design Name. - source_project_path : str - Source Project full path. + pyaedt_app : :class:`pyaedt.q3d.Q3d` or :class:`pyaedt.q3d.Q2d` or :class:`pyaedt.q3d.Hfss` + pyaedt application object to include. It could be an Hfss object, a Q3d object or a Q2d. solution_name : str, optional Name of the solution and sweep. The default is ``"Setup1 : Sweep"``. extrusion_length : float, str, optional @@ -1198,7 +1197,8 @@ def add_subcircuit_dynamic_link( Matrix to link to the subcircuit. Default to `"Original"`. It only applies to 2D Extractor and Q3D. tline_port : str, optional Port to be used for tramsission line. Only applies to Hfss. - + comp_name : str, optional + Component name. Returns ------- :class:`pyaedt.modeler.Object3d.CircuitComponent` @@ -1212,8 +1212,8 @@ def add_subcircuit_dynamic_link( >>> oDesign.AddCompInstance >>> oDesign.AddDynamicLink """ - - comp_name = generate_unique_name(pyaedt_app.design_name) + if not comp_name: + comp_name = generate_unique_name(pyaedt_app.design_name) source_project_path = pyaedt_app.project_file source_design_name = pyaedt_app.design_name matrix = None From 7e781c212df0fc174c90fa0d8ea5d94c7bba14c8 Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 10:29:00 +0100 Subject: [PATCH 06/11] fixed example --- _unittest/test_22_Circuit_DynamicLink.py | 18 ++---- pyaedt/hfss.py | 82 ++++++++++++------------ pyaedt/modeler/PrimitivesNexxim.py | 6 +- 3 files changed, 51 insertions(+), 55 deletions(-) diff --git a/_unittest/test_22_Circuit_DynamicLink.py b/_unittest/test_22_Circuit_DynamicLink.py index f7fdd1d2bb3..31e02210b8c 100644 --- a/_unittest/test_22_Circuit_DynamicLink.py +++ b/_unittest/test_22_Circuit_DynamicLink.py @@ -194,24 +194,20 @@ def test_10_q3d_link(self): q2d = Q2d(self.q3d) proj_path = self.q3d proj_name = q2d.project_name - assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( - q2d, extrusion_length=25 - ) + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(q2d, extrusion_length=25) if proj_name in self.aedtapp.project_list: proj_path = proj_name print("Started Test 10") q3d = Q3d(proj_path) - assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( - q3d, solution_name="Setup1 : LastAdaptive" - ) + + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(q3d, solution_name="Setup1 : LastAdaptive") print("Started Test 10") hfss = Hfss(proj_path) - assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup1 : Sweep" - ) + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup1 : Sweep") print("Started Test 10") - - assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup2 : Sweep", tline_port="1" + hfss = Hfss(proj_path) + assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( + hfss, solution_name="Setup2 : Sweep", tline_port="1" ) print("Started Test 10") - diff --git a/pyaedt/hfss.py b/pyaedt/hfss.py index 26d1a50cf45..679e78a2093 100644 --- a/pyaedt/hfss.py +++ b/pyaedt/hfss.py @@ -3270,8 +3270,8 @@ def assign_perfecte_to_sheets(self, sheet_list, sourcename=None, is_infinite_gnd Create a sheet and use it to create a Perfect E. - >>> sheet = hfss.modeler.primitives.create_rectangle(hfss.PLANE.XY, [0, 0, -90], - ... [10, 2], name="PerfectESheet", matname="Copper") + >>> sheet = hfss.modeler.create_rectangle(hfss.PLANE.XY, [0, 0, -90], + ... [10, 2], name="PerfectESheet", matname="Copper") >>> perfect_e_from_sheet = hfss.assign_perfecte_to_sheets(sheet.name, "PerfectEFromSheet") >>> type(perfect_e_from_sheet) @@ -3312,8 +3312,8 @@ def assign_perfecth_to_sheets(self, sheet_list, sourcename=None): Create a sheet and use it to create a Perfect H. - >>> sheet = hfss.modeler.primitives.create_rectangle(hfss.PLANE.XY, [0, 0, -90], - ... [10, 2], name="PerfectHSheet", matname="Copper") + >>> sheet = hfss.modeler.create_rectangle(hfss.PLANE.XY, [0, 0, -90], + ... [10, 2], name="PerfectHSheet", matname="Copper") >>> perfect_h_from_sheet = hfss.assign_perfecth_to_sheets(sheet.name, "PerfectHFromSheet") >>> type(perfect_h_from_sheet) @@ -3372,9 +3372,9 @@ def assign_lumped_rlc_to_sheet( Create a sheet and use it to create a lumped RLC. - >>> sheet = hfss.modeler.primitives.create_rectangle(hfss.PLANE.XY, - ... [0, 0, -90], [10, 2], name="RLCSheet", - ... matname="Copper") + >>> sheet = hfss.modeler.create_rectangle(hfss.PLANE.XY, + ... [0, 0, -90], [10, 2], name="RLCSheet", + ... matname="Copper") >>> lumped_rlc_to_sheet = hfss.assign_lumped_rlc_to_sheet(sheet.name, hfss.AxisDir.XPos, ... Rvalue=50, Lvalue=1e-9, ... Cvalue=1e-6) @@ -3384,14 +3384,14 @@ def assign_lumped_rlc_to_sheet( """ if self.solution_type in ["Modal", "Terminal", "Transient Network", "SBR+"] and (Rvalue or Lvalue or Cvalue): - point0, point1 = self.modeler.primitives.get_mid_points_on_dir(sheet_name, axisdir) + point0, point1 = self.modeler.get_mid_points_on_dir(sheet_name, axisdir) if not sourcename: sourcename = generate_unique_name("Lump") elif sourcename in self.modeler.get_boundaries_name(): sourcename = generate_unique_name(sourcename) - start = [str(i) + self.modeler.primitives.model_units for i in point0] - stop = [str(i) + self.modeler.primitives.model_units for i in point1] + start = [str(i) + self.modeler.model_units for i in point0] + stop = [str(i) + self.modeler.model_units for i in point1] props = OrderedDict() props["Objects"] = [sheet_name] props["CurrentLine"] = OrderedDict({"Start": start, "End": stop}) @@ -3442,9 +3442,9 @@ def assign_impedance_to_sheet(self, sheet_name, sourcename=None, resistance=50, Create a sheet and use it to create an impedance. - >>> sheet = hfss.modeler.primitives.create_rectangle(hfss.PLANE.XY, - ... [0, 0, -90], [10, 2], name="ImpedanceSheet", - ... matname="Copper") + >>> sheet = hfss.modeler.create_rectangle(hfss.PLANE.XY, + ... [0, 0, -90], [10, 2], name="ImpedanceSheet", + ... matname="Copper") >>> impedance_to_sheet = hfss.assign_impedance_to_sheet(sheet.name, "ImpedanceFromSheet", 100, 50) >>> type(impedance_to_sheet) @@ -3521,13 +3521,13 @@ def create_circuit_port_from_edges( toward the first edge of the second rectangle. >>> plane = hfss.PLANE.XY - >>> rectangle1 = hfss.modeler.primitives.create_rectangle(plane, [10, 10, 10], [10, 10], - ... name="rectangle1_for_port") - >>> edges1 = hfss.modeler.primitives.get_object_edges(rectangle1.id) + >>> rectangle1 = hfss.modeler.create_rectangle(plane, [10, 10, 10], [10, 10], + ... name="rectangle1_for_port") + >>> edges1 = hfss.modeler.get_object_edges(rectangle1.id) >>> first_edge = edges1[0] - >>> rectangle2 = hfss.modeler.primitives.create_rectangle(plane, [30, 10, 10], [10, 10], - ... name="rectangle2_for_port") - >>> edges2 = hfss.modeler.primitives.get_object_edges(rectangle2.id) + >>> rectangle2 = hfss.modeler.create_rectangle(plane, [30, 10, 10], [10, 10], + ... name="rectangle2_for_port") + >>> edges2 = hfss.modeler.get_object_edges(rectangle2.id) >>> second_edge = edges2[0] >>> hfss.solution_type = "Modal" >>> hfss.create_circuit_port_from_edges(first_edge, second_edge, port_name="PortExample", @@ -3576,9 +3576,9 @@ def edit_source(self, portandmode, powerin, phase="0deg"): Create a circle sheet and use it to create a wave port. Set up the thermal power for the port created above. - >>> sheet = hfss.modeler.primitives.create_circle(hfss.PLANE.YZ, - ... [-20, 0, 0], 10, - ... name="sheet_for_source") + >>> sheet = hfss.modeler.create_circle(hfss.PLANE.YZ, + ... [-20, 0, 0], 10, + ... name="sheet_for_source") >>> hfss.solution_type = "Modal" >>> wave_port = hfss.create_wave_port_from_sheet(sheet, 5, hfss.AxisDir.XNeg, 40, ... 2, "SheetWavePort", True) @@ -3635,9 +3635,9 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue Create a circle sheet and use it to create a wave port. Set the thickness of this circle sheet to ``"2 mm"``. - >>> sheet_for_thickness = hfss.modeler.primitives.create_circle(hfss.PLANE.YZ, - ... [60, 60, 60], 10, - ... name="SheetForThickness") + >>> sheet_for_thickness = hfss.modeler.create_circle(hfss.PLANE.YZ, + ... [60, 60, 60], 10, + ... name="SheetForThickness") >>> port_for_thickness = hfss.create_wave_port_from_sheet(sheet_for_thickness, 5, hfss.AxisDir.XNeg, ... 40, 2, "WavePortForThickness", True) >>> hfss.thicken_port_sheets(["SheetForThickness"], 2) @@ -3648,7 +3648,7 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue tol = 1e-6 ports_ID = {} - aedt_bounding_box = self.modeler.primitives.get_model_bounding_box() + aedt_bounding_box = self.modeler.get_model_bounding_box() directions = {} for el in inputlist: objID = self.modeler.oeditor.GetFaceIDs(el) @@ -3661,7 +3661,7 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue ["NAME:SheetThickenParameters", "Thickness:=", str(l) + "mm", "BothSides:=", False], ) # aedt_bounding_box2 = self._oeditor.GetModelBoundingBox() - aedt_bounding_box2 = self.modeler.primitives.get_model_bounding_box() + aedt_bounding_box2 = self.modeler.get_model_bounding_box() self._odesign.Undo() if aedt_bounding_box != aedt_bounding_box2: directions[el] = "External" @@ -3684,7 +3684,7 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue objID = self.modeler.oeditor.GetFaceIDs(el) maxarea = 0 for f in objID: - faceArea = self.modeler.primitives.get_face_area(int(f)) + faceArea = self.modeler.get_face_area(int(f)) if faceArea > maxarea: maxarea = faceArea faceCenter = self.modeler.oeditor.GetFaceCenter(int(f)) @@ -3704,7 +3704,7 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue try: fc2 = self.modeler.oeditor.GetFaceCenter(f) fc2 = [float(i) for i in fc2] - fa2 = self.modeler.primitives.get_face_area(int(f)) + fa2 = self.modeler.get_face_area(int(f)) faceoriginal = [float(i) for i in faceCenter] # dist = mat.sqrt(sum([(a*a-b*b) for a,b in zip(faceCenter, fc2)])) if abs(fa2 - maxarea) < tol ** 2 and ( @@ -4154,8 +4154,8 @@ def assign_radiation_boundary_to_objects(self, obj_names, boundary_name=""): Create a box and assign a radiation boundary to it. - >>> radiation_box = hfss.modeler.primitives.create_box([0, -200, -200], [200, 200, 200], - ... name="Radiation_box") + >>> radiation_box = hfss.modeler.create_box([0, -200, -200], [200, 200, 200], + ... name="Radiation_box") >>> radiation = hfss.assign_radiation_boundary_to_objects("Radiation_box") >>> type(radiation) @@ -4196,9 +4196,9 @@ def assign_radiation_boundary_to_faces(self, faces_id, boundary_name=""): Create a box. Select the faces of this box and assign a radiation boundary to them. - >>> radiation_box = hfss.modeler.primitives.create_box([0 , -100, 0], [200, 200, 200], - ... name="RadiationForFaces") - >>> ids = [i.id for i in hfss.modeler.primitives["RadiationForFaces"].faces] + >>> radiation_box = hfss.modeler.create_box([0 , -100, 0], [200, 200, 200], + ... name="RadiationForFaces") + >>> ids = [i.id for i in hfss.modeler["RadiationForFaces"].faces] >>> radiation = hfss.assign_radiation_boundary_to_faces(ids) >>> type(radiation) @@ -4242,19 +4242,19 @@ def _create_sbr_doppler_setup( else: setup1.props["SbrRangeDopplerWaveformType"] = setup_type setup1.props["SbrRangeDopplerTimeVariable"] = time_var - setup1.props["SbrRangeDopplerCenterFreq"] = self.modeler.primitives._arg_with_dim(center_freq, "GHz") - setup1.props["SbrRangeDopplerRangeResolution"] = self.modeler.primitives._arg_with_dim(resolution, "meter") - setup1.props["SbrRangeDopplerRangePeriod"] = self.modeler.primitives._arg_with_dim(period, "meter") - setup1.props["SbrRangeDopplerVelocityResolution"] = self.modeler.primitives._arg_with_dim( + setup1.props["SbrRangeDopplerCenterFreq"] = self.modeler._arg_with_dim(center_freq, "GHz") + setup1.props["SbrRangeDopplerRangeResolution"] = self.modeler._arg_with_dim(resolution, "meter") + setup1.props["SbrRangeDopplerRangePeriod"] = self.modeler._arg_with_dim(period, "meter") + setup1.props["SbrRangeDopplerVelocityResolution"] = self.modeler._arg_with_dim( velocity_resolution, "m_per_sec" ) - setup1.props["SbrRangeDopplerVelocityMin"] = self.modeler.primitives._arg_with_dim(min_velocity, "m_per_sec") - setup1.props["SbrRangeDopplerVelocityMax"] = self.modeler.primitives._arg_with_dim(max_velocity, "m_per_sec") + setup1.props["SbrRangeDopplerVelocityMin"] = self.modeler._arg_with_dim(min_velocity, "m_per_sec") + setup1.props["SbrRangeDopplerVelocityMax"] = self.modeler._arg_with_dim(max_velocity, "m_per_sec") setup1.props["DopplerRayDensityPerWavelength"] = ray_density_per_wavelenght setup1.props["MaxNumberOfBounces"] = max_bounces if setup_type != "PulseDoppler": setup1.props["IncludeRangeVelocityCouplingEffect"] = include_coupling_effects - setup1.props["SbrRangeDopplerA/DSamplingRate"] = self.modeler.primitives._arg_with_dim( + setup1.props["SbrRangeDopplerA/DSamplingRate"] = self.modeler._arg_with_dim( doppler_ad_sampling_rate, "MHz" ) setup1.update() diff --git a/pyaedt/modeler/PrimitivesNexxim.py b/pyaedt/modeler/PrimitivesNexxim.py index 08dc9052a25..113e3a5cdad 100644 --- a/pyaedt/modeler/PrimitivesNexxim.py +++ b/pyaedt/modeler/PrimitivesNexxim.py @@ -1173,7 +1173,7 @@ def add_subcircuit_hfss_link( @aedt_exception_handler def add_subcircuit_dynamic_link( self, - pyaedt_app, + pyaedt_app=None, solution_name=None, extrusion_length=None, enable_cable_modeling=True, @@ -1185,7 +1185,7 @@ def add_subcircuit_dynamic_link( Parameters ---------- - pyaedt_app : :class:`pyaedt.q3d.Q3d` or :class:`pyaedt.q3d.Q2d` or :class:`pyaedt.q3d.Hfss` + pyaedt_app : :class:`pyaedt.q3d.Q3d` or :class:`pyaedt.q3d.Q2d` or :class:`pyaedt.q3d.Hfss`. pyaedt application object to include. It could be an Hfss object, a Q3d object or a Q2d. solution_name : str, optional Name of the solution and sweep. The default is ``"Setup1 : Sweep"``. @@ -1301,7 +1301,7 @@ def _add_subcircuit_link( extrusion_length_q2d=10, matrix=None, enable_cable_modeling=False, - default_matrix="Original" + default_matrix="Original", ): """Add a subcircuit HFSS link. From 0754b50533ef82ba99111d365613a9b272e92f00 Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 11:07:28 +0100 Subject: [PATCH 07/11] fixed example --- pyaedt/hfss.py | 8 ++------ pyaedt/modeler/PrimitivesNexxim.py | 1 + 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/pyaedt/hfss.py b/pyaedt/hfss.py index 679e78a2093..38cba88f77f 100644 --- a/pyaedt/hfss.py +++ b/pyaedt/hfss.py @@ -4245,18 +4245,14 @@ def _create_sbr_doppler_setup( setup1.props["SbrRangeDopplerCenterFreq"] = self.modeler._arg_with_dim(center_freq, "GHz") setup1.props["SbrRangeDopplerRangeResolution"] = self.modeler._arg_with_dim(resolution, "meter") setup1.props["SbrRangeDopplerRangePeriod"] = self.modeler._arg_with_dim(period, "meter") - setup1.props["SbrRangeDopplerVelocityResolution"] = self.modeler._arg_with_dim( - velocity_resolution, "m_per_sec" - ) + setup1.props["SbrRangeDopplerVelocityResolution"] = self.modeler._arg_with_dim(velocity_resolution, "m_per_sec") setup1.props["SbrRangeDopplerVelocityMin"] = self.modeler._arg_with_dim(min_velocity, "m_per_sec") setup1.props["SbrRangeDopplerVelocityMax"] = self.modeler._arg_with_dim(max_velocity, "m_per_sec") setup1.props["DopplerRayDensityPerWavelength"] = ray_density_per_wavelenght setup1.props["MaxNumberOfBounces"] = max_bounces if setup_type != "PulseDoppler": setup1.props["IncludeRangeVelocityCouplingEffect"] = include_coupling_effects - setup1.props["SbrRangeDopplerA/DSamplingRate"] = self.modeler._arg_with_dim( - doppler_ad_sampling_rate, "MHz" - ) + setup1.props["SbrRangeDopplerA/DSamplingRate"] = self.modeler._arg_with_dim(doppler_ad_sampling_rate, "MHz") setup1.update() return setup1 diff --git a/pyaedt/modeler/PrimitivesNexxim.py b/pyaedt/modeler/PrimitivesNexxim.py index 113e3a5cdad..9bfc7458eec 100644 --- a/pyaedt/modeler/PrimitivesNexxim.py +++ b/pyaedt/modeler/PrimitivesNexxim.py @@ -1199,6 +1199,7 @@ def add_subcircuit_dynamic_link( Port to be used for tramsission line. Only applies to Hfss. comp_name : str, optional Component name. + Returns ------- :class:`pyaedt.modeler.Object3d.CircuitComponent` From 10fb3c16fff1b5dca4922d2b8814007871d7988c Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 11:19:57 +0100 Subject: [PATCH 08/11] fixed example --- examples/06-Multiphysics/Hfss_Mechanical.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/06-Multiphysics/Hfss_Mechanical.py b/examples/06-Multiphysics/Hfss_Mechanical.py index 20883b331fd..4330d457596 100644 --- a/examples/06-Multiphysics/Hfss_Mechanical.py +++ b/examples/06-Multiphysics/Hfss_Mechanical.py @@ -53,7 +53,7 @@ # argument of set_sim_option_on_hfss_subcircuit can be the component name, the component id or # the component object. -circuit.modeler.schematic.refresh_dynamic_link(hfss.design_name) +circuit.modeler.schematic.refresh_dynamic_link(hfss_comp.composed_name) circuit.modeler.schematic.set_sim_option_on_hfss_subcircuit(hfss_comp) hfss_setup_name = hfss.setups[0].name + " : " + hfss.setups[0].sweeps[0].name circuit.modeler.schematic.set_sim_solution_on_hfss_subcircuit(hfss_comp.composed_name, hfss_setup_name) From 8779729d910b720ccd694a907798aaca1de503e7 Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 12:21:10 +0100 Subject: [PATCH 09/11] fixed example --- _unittest/test_22_Circuit_DynamicLink.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/_unittest/test_22_Circuit_DynamicLink.py b/_unittest/test_22_Circuit_DynamicLink.py index 31e02210b8c..e53200dc13e 100644 --- a/_unittest/test_22_Circuit_DynamicLink.py +++ b/_unittest/test_22_Circuit_DynamicLink.py @@ -189,7 +189,6 @@ def test_09_setup(self): assert LNA_setup.update() def test_10_q3d_link(self): - print("Started Test 10") self.aedtapp.insert_design("test_link") q2d = Q2d(self.q3d) proj_path = self.q3d @@ -197,17 +196,13 @@ def test_10_q3d_link(self): assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(q2d, extrusion_length=25) if proj_name in self.aedtapp.project_list: proj_path = proj_name - print("Started Test 10") q3d = Q3d(proj_path) assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(q3d, solution_name="Setup1 : LastAdaptive") - print("Started Test 10") hfss = Hfss(proj_path) assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup1 : Sweep") - print("Started Test 10") hfss = Hfss(proj_path) assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link( hfss, solution_name="Setup2 : Sweep", tline_port="1" ) - print("Started Test 10") From 83f927216a7fad8de82105ba534ba8e4c900a1f2 Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 12:33:56 +0100 Subject: [PATCH 10/11] fixed example --- _unittest/test_00_EDB.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_unittest/test_00_EDB.py b/_unittest/test_00_EDB.py index 902e22f2bc1..d5b036b76f1 100644 --- a/_unittest/test_00_EDB.py +++ b/_unittest/test_00_EDB.py @@ -57,7 +57,7 @@ def test_01B_get_vias_from_nets(self): assert self.edbapp.core_padstack.get_via_instance_from_net("GND") assert not self.edbapp.core_padstack.get_via_instance_from_net(["GND2"]) - def tesCt_01_flip_layer_stackup(self): + def test_01_flip_layer_stackup(self): assert self.edbapp.core_stackup.place_in_layout() def test_02_get_properties(self): From efd6716f247fd4773b7eb982cd27d70dcd4ffa90 Mon Sep 17 00:00:00 2001 From: Massimo Capodiferro Date: Wed, 9 Feb 2022 14:09:23 +0100 Subject: [PATCH 11/11] fixed UT --- _unittest/test_00_EDB.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_unittest/test_00_EDB.py b/_unittest/test_00_EDB.py index d5b036b76f1..872b93cf055 100644 --- a/_unittest/test_00_EDB.py +++ b/_unittest/test_00_EDB.py @@ -191,8 +191,8 @@ def test_17_components(self): assert "R1" in list(self.edbapp.core_components.components.keys()) assert self.edbapp.core_components.components["R1"].res_value assert self.edbapp.core_components.components["R1"].placement_layer - assert self.edbapp.core_components.components["R1"].lower_elevation - assert self.edbapp.core_components.components["R1"].upper_elevation + assert isinstance(self.edbapp.core_components.components["R1"].lower_elevation, float) + assert isinstance(self.edbapp.core_components.components["R1"].upper_elevation, float) assert self.edbapp.core_components.components["R1"].top_bottom_association == 0 assert self.edbapp.core_components.components["R1"].pinlist pinname = self.edbapp.core_components.components["R1"].pinlist[0].GetName()