Skip to content

Fix/dynamic link #841

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Feb 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions _unittest/test_00_EDB.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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
Expand Down Expand Up @@ -190,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()
Expand Down
28 changes: 16 additions & 12 deletions _unittest/test_22_Circuit_DynamicLink.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -190,15 +190,19 @@ def test_09_setup(self):

def test_10_q3d_link(self):
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
q3d = Q3d(proj_path)

assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(q3d, solution_name="Setup1 : LastAdaptive")
hfss = Hfss(proj_path)

assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup1 : Sweep")
hfss = Hfss(proj_path)
assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(
"2DExtractorDesign1", self.q3d, solution_name="Setup1 : Sweep", extrusion_length=25
)
assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(
"Q3DDesign1", self.q3d, solution_name="Setup1 : LastAdaptive"
)
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(
"Terminal", self.q3d, solution_name="Setup2 : Sweep", tline_port="1"
hfss, solution_name="Setup2 : Sweep", tline_port="1"
)
7 changes: 3 additions & 4 deletions examples/06-Multiphysics/Hfss_Mechanical.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,11 @@
# 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
# ~~~~~~~~~~~~~~
Expand All @@ -54,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("MyHfss")
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)
Expand Down
86 changes: 41 additions & 45 deletions pyaedt/hfss.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -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)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -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)
Expand All @@ -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})
Expand Down Expand Up @@ -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)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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"
Expand All @@ -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))
Expand All @@ -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 (
Expand Down Expand Up @@ -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)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -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)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -4242,21 +4242,17 @@ 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(
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["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._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(
doppler_ad_sampling_rate, "MHz"
)
setup1.props["SbrRangeDopplerA/DSamplingRate"] = self.modeler._arg_with_dim(doppler_ad_sampling_rate, "MHz")
setup1.update()
return setup1

Expand Down
Loading