Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
6357817
make sure all EMIT UI props are accessible in pyaedt
jsalant22 Oct 30, 2025
947c05f
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Oct 30, 2025
7a0496c
chore: adding changelog file 6835.fixed.md [dependabot-skip]
pyansys-ci-bot Oct 30, 2025
317f64a
remove duplicate functions
jsalant22 Oct 30, 2025
c73f853
Merge branch 'B1345240_emit' of https://github.com/ansys/pyaedt into …
jsalant22 Oct 30, 2025
05a7bd4
fix test due to 25.2 aedt bug
jsalant22 Oct 30, 2025
16bcab9
Update tests/system/emit/test_emit.py
jsalant22 Oct 31, 2025
94df8e0
Merge branch 'main' into B1345240_emit
jsalant22 Oct 31, 2025
6fab7a7
add some test coverage
jsalant22 Oct 31, 2025
83b5e62
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Oct 31, 2025
97cfa31
Update revision.py
jsalant22 Oct 31, 2025
08cdad3
Update revision.py
jsalant22 Oct 31, 2025
2c52827
add coverage test
jsalant22 Oct 31, 2025
b6ecc8f
remove comment
jsalant22 Oct 31, 2025
b22ae0d
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Oct 31, 2025
1333550
Merge branch 'main' into B1345240_emit
jsalant22 Oct 31, 2025
1979ca4
fix test
jsalant22 Nov 3, 2025
a8b2a94
Merge branch 'B1345240_emit' of https://github.com/ansys/pyaedt into …
jsalant22 Nov 3, 2025
c7c520a
add some error checking
jsalant22 Nov 3, 2025
dc55bc9
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Nov 3, 2025
815335a
fix some enums
jsalant22 Nov 3, 2025
b53f2a5
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Nov 3, 2025
a29ecc7
Merge branch 'main' into B1345240_emit
jsalant22 Nov 3, 2025
c43f8e0
Merge branch 'main' into B1345240_emit
jsalant22 Nov 4, 2025
f3c06fa
add coverage
jsalant22 Nov 6, 2025
4cb8f70
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Nov 6, 2025
44c706d
fix codacy and force unique names for renaming
jsalant22 Nov 6, 2025
be3e240
fix test
jsalant22 Nov 6, 2025
da916d8
skip builtins
jsalant22 Nov 6, 2025
9bce2ed
speed up test
jsalant22 Nov 7, 2025
d478a1b
increase timeout
jsalant22 Nov 7, 2025
3c56d2c
Merge branch 'main' into B1345240_emit
jsalant22 Nov 7, 2025
6481a87
change some displayNames to subType
jsalant22 Nov 7, 2025
bde5c48
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Nov 7, 2025
911b7c2
fix mux band subtype
jsalant22 Nov 10, 2025
868398b
Merge branch 'B1345240_emit' of https://github.com/ansys/pyaedt into …
jsalant22 Nov 10, 2025
aa1b77a
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Nov 10, 2025
73194da
skip all nodes test on 252
jsalant22 Nov 10, 2025
11bc74f
Merge branch 'B1345240_emit' of https://github.com/ansys/pyaedt into …
jsalant22 Nov 10, 2025
6cae612
Merge branch 'main' into B1345240_emit
jsalant22 Nov 10, 2025
a59e00a
update some tests
jsalant22 Nov 11, 2025
3c3e06a
Merge branch 'B1345240_emit' of https://github.com/ansys/pyaedt into …
jsalant22 Nov 11, 2025
647339b
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Nov 11, 2025
2236053
add test for importing cad/touchstone
jsalant22 Nov 11, 2025
f98241e
Merge branch 'B1345240_emit' of https://github.com/ansys/pyaedt into …
jsalant22 Nov 11, 2025
5ceb3e6
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Nov 11, 2025
108fef6
fix precommit
jsalant22 Nov 11, 2025
7f460e1
Merge branch 'B1345240_emit' of https://github.com/ansys/pyaedt into …
jsalant22 Nov 11, 2025
252f7a5
fix some ide warnings
jsalant22 Nov 12, 2025
0da4909
fix test
jsalant22 Nov 12, 2025
48bb8b1
fix availability test
jsalant22 Nov 12, 2025
4ac472d
skip test
jsalant22 Nov 12, 2025
8bdd90b
initialize the tables param
jsalant22 Nov 13, 2025
1dd6188
cleanup some IDE warnings
jsalant22 Nov 13, 2025
c1f06d1
CHORE: Auto fixes from pre-commit hooks
pre-commit-ci[bot] Nov 13, 2025
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
2 changes: 1 addition & 1 deletion .github/workflows/ci_cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -993,7 +993,7 @@ jobs:
with:
max_attempts: 2
retry_on: error
timeout_minutes: 30
timeout_minutes: 40
command: |
.venv\Scripts\Activate.ps1
pytest ${{ env.PYTEST_ARGUMENTS }} --timeout=600 -v -rA --color=yes -m emit
Expand Down
1 change: 1 addition & 0 deletions doc/changelog.d/6835.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Emit properties cleanup
6 changes: 5 additions & 1 deletion ignore_words.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,8 @@ aline
COM
gRPC
Toolkits
Extensions
Extensions
Synopsys
intermodulation
intermod
Intermod
3 changes: 2 additions & 1 deletion src/ansys/aedt/core/emit_core/emit_schematic.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,8 @@ def create_radio_antenna(
new_antenna = self.create_component("Antenna", antenna_name, "Antennas")
if new_radio and new_antenna:
self.connect_components(new_antenna.name, new_radio.name) # Connect antenna to radio
return new_radio, new_antenna
return new_radio, new_antenna
raise RuntimeError(f"Failed to create radio of type '{radio_type}' or antenna.")
except Exception as e:
self.emit_instance.logger.error(f"Failed to create radio of type '{radio_type}' or antenna: {e}")
raise RuntimeError(f"Failed to create radio of type '{radio_type}' or antenna: {e}")
Expand Down
72 changes: 57 additions & 15 deletions src/ansys/aedt/core/emit_core/nodes/emit_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,31 @@ def name(self) -> str:
"""
return self._get_property("Name", True)

@name.setter
def name(self, requested_name: str):
"""Renames the node/component.

Parameters
----------
requested_name : str
New name for the node/component.

Raises
------
ValueError
If the node is read-only or cannot be renamed.
"""
if self._result_id > 0:
raise ValueError("This node is read-only for kept results.")

if self.get_is_component():
try:
self._emit_obj.oeditor.RenameComponent(self.name, requested_name)
except Exception:
raise ValueError(f"Failed to rename {self.name} to {requested_name}")
else:
_ = self._oRevisionData.RenameEmitNode(self._result_id, self._node_id, requested_name)

@property
def _node_type(self) -> str:
"""Type of the node.
Expand Down Expand Up @@ -239,7 +264,7 @@ def children(self):
child_nodes = [self._get_node(child_id) for child_id in child_ids]
return child_nodes

def _get_property(self, prop, skipChecks=False, isTable=False) -> Union[str, List[str]]:
def _get_property(self, prop, skipChecks: bool = False, isTable: bool = False) -> Union[str, List[str]]:
"""Fetch the value of a given property.

Parameters
Expand All @@ -257,7 +282,7 @@ def _get_property(self, prop, skipChecks=False, isTable=False) -> Union[str, Lis
kv_pairs = [prop.split("=") for prop in props]
selected_kv_pairs = [kv for kv in kv_pairs if kv[0].rstrip() == prop]
if len(selected_kv_pairs) < 1:
return ""
raise ValueError(f"Property {prop} not found or not available for {self._node_type} configuration.")

selected_kv_pair = selected_kv_pairs[0]
val = selected_kv_pair[1]
Expand All @@ -276,9 +301,9 @@ def _get_property(self, prop, skipChecks=False, isTable=False) -> Union[str, Lis
except Exception:
raise self._emit_obj.logger.aedt_messages.error_level[-1]

def _set_property(self, prop, value):
def _set_property(self, prop, value, skipChecks=False):
try:
self._oRevisionData.SetEmitNodeProperties(self._result_id, self._node_id, [f"{prop}={value}"], True)
self._oRevisionData.SetEmitNodeProperties(self._result_id, self._node_id, [f"{prop}={value}"], skipChecks)
except Exception:
error_text = None
if len(self._emit_obj.logger.messages.error_level) > 0:
Expand All @@ -288,7 +313,7 @@ def _set_property(self, prop, value):
f'Exception in SetEmitNodeProperties: Failed setting property "{prop}" to "{value}" for '
f'{self.properties["Type"]} node "{self.name}"'
)
raise Exception(error_text)
raise ValueError(error_text)

@staticmethod
def _string_to_value_units(value) -> tuple[float, str]:
Expand Down Expand Up @@ -408,6 +433,9 @@ def _delete(self):
def _rename(self, requested_name: str) -> str:
"""Renames the node/component.

.. deprecated: 0.21.3
Use name property instead

Parameters
----------
requested_name : str
Expand All @@ -423,15 +451,10 @@ def _rename(self, requested_name: str) -> str:
ValueError
If the node is read-only and cannot be renamed.
"""
if self.get_is_component():
if self._result_id > 0:
raise ValueError("This node is read-only for kept results.")
self._emit_obj.oeditor.RenameComponent(self.name, requested_name)
new_name = requested_name
else:
new_name = self._oRevisionData.RenameEmitNode(self._result_id, self._node_id, requested_name)
warnings.warn("This property is deprecated in 0.21.3. Use the name property instead.", DeprecationWarning)
self.name = requested_name

return new_name
return self.name

def _duplicate(self, new_name):
raise NotImplementedError("This method is not implemented yet.")
Expand All @@ -446,8 +469,24 @@ def _import(self, file_path: str, import_type: str):
import_type : str
Type of import. Options are: CsvFile, TxMeasurement, RxMeasurement,
SpectralData, TouchstoneCoupling, CAD.

Returns
-------
node: EmitNode
The node.
"""
self._oRevisionData.EmitNodeImport(self._result_id, self._node_id, file_path, import_type)
try:
node_id = self._oRevisionData.EmitNodeImport(self._result_id, self._node_id, file_path, import_type)
except Exception:
error_text = None
if len(self._emit_obj.logger.messages.error_level) > 0:
error_text = self._emit_obj.logger.aedt_messages.error_level[-1]
else:
error_text = (
f'Exception in EmitNodeImport: Failed to import: "{file_path}" of node type: "{import_type}"'
)
raise Exception(error_text)
return self._get_node(node_id)

def _export_model(self, file_path: str):
"""Exports an Emit node's model to a file.
Expand Down Expand Up @@ -514,6 +553,7 @@ def _get_table_data(self):
The node's table data as a list of tuples.
[(x1, y1, z1), (x2, y2, z2)]
"""
table = []
try:
if self._is_column_data_table():
# Column Data tables
Expand All @@ -529,6 +569,8 @@ def _get_table_data(self):
# with ';' separating rows and '|' separating columns
table_key = self._get_property("TableKey", True)
string_table = self._get_property(table_key, True, True)
if string_table == "":
return table

def try_float(val):
try:
Expand Down Expand Up @@ -563,7 +605,7 @@ def _set_table_data(self, table):
# with ';' separating rows and '|' separating columns
table_key = self._get_property("TableKey", True)
data = ";".join("|".join(map(str, row)) for row in table)
self._set_property(table_key, data)
self._set_property(table_key, data, True)
except Exception as e:
print(f"Failed to set table data for node {self.name}. Error: {e}")

Expand Down
4 changes: 3 additions & 1 deletion src/ansys/aedt/core/emit_core/nodes/emitter_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ class EmitterNode(EmitNode):
"""

def __init__(self, emit_obj, result_id, node_id):
self._is_component = True
EmitNode.__init__(self, emit_obj, result_id, node_id)
self._is_component = True
self._radio_node = RadioNode(emit_obj, result_id, node_id)

# create_component code provides the radio_id, but we also
Expand All @@ -66,6 +66,7 @@ def __init__(self, emit_obj, result_id, node_id):
ant_id = self._oRevisionData.GetChildNodeID(result_id, scene_node_id, ant)
self._antenna_node = AntennaNode(emit_obj, result_id, ant_id)

@property
def node_type(self) -> str:
"""The type of this emit node"""
return "EmitterNode"
Expand Down Expand Up @@ -106,6 +107,7 @@ def get_antenna(self) -> AntennaNode:
"""
return self._antenna_node

@property
def children(self):
"""Overridden to return the Waveforms

Expand Down
20 changes: 3 additions & 17 deletions src/ansys/aedt/core/emit_core/nodes/generated/amplifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,24 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.


from ansys.aedt.core.emit_core.nodes.emit_node import EmitNode


class Amplifier(EmitNode):
def __init__(self, emit_obj, result_id, node_id):
self._is_component = True
EmitNode.__init__(self, emit_obj, result_id, node_id)
self._is_component = True

@property
def node_type(self) -> str:
"""The type of this emit node."""
return self._node_type

def rename(self, new_name: str):
def rename(self, new_name: str = ""):
"""Rename this node"""
self._rename(new_name)

def duplicate(self, new_name: str):
def duplicate(self, new_name: str = ""):
"""Duplicate this node"""
return self._duplicate(new_name)

Expand All @@ -64,19 +63,6 @@ def table_data(self):
def table_data(self, value):
self._set_table_data(value)

@property
def filename(self) -> str:
"""Name of file defining the outboard component.

Value should be a full file path.
"""
val = self._get_property("Filename")
return val

@filename.setter
def filename(self, value: str):
self._set_property("Filename", f"{value}")

@property
def noise_temperature(self) -> float:
"""System Noise temperature (K) of the component.
Expand Down
42 changes: 21 additions & 21 deletions src/ansys/aedt/core/emit_core/nodes/generated/antenna_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@

class AntennaNode(EmitNode):
def __init__(self, emit_obj, result_id, node_id):
self._is_component = False
EmitNode.__init__(self, emit_obj, result_id, node_id)
self._is_component = True

@property
def parent(self):
Expand All @@ -47,11 +47,11 @@ def add_antenna_passband(self):
"""Add a New Passband to this Antenna"""
return self._add_child_node("Antenna Passband")

def rename(self, new_name: str):
def rename(self, new_name: str = ""):
"""Rename this node"""
self._rename(new_name)

def duplicate(self, new_name: str):
def duplicate(self, new_name: str = ""):
"""Duplicate this node"""
return self._duplicate(new_name)

Expand Down Expand Up @@ -112,8 +112,8 @@ def relative_position(self, value):
self._set_property("Relative Position", f"{value}")

class OrientationModeOption(Enum):
ROLL_PITCH_YAW = "Roll-Pitch-Yaw"
AZ_EL_TWIST = "Az-El-Twist"
ROLL_PITCH_YAW = "rpyDeg"
AZ_EL_TWIST = "aetDeg"

@property
def orientation_mode(self) -> OrientationModeOption:
Expand Down Expand Up @@ -181,29 +181,29 @@ def antenna_temperature(self) -> float:
def antenna_temperature(self, value: float):
self._set_property("Antenna Temperature", f"{value}")

class TypeOption(Enum):
class SubTypeOption(Enum):
ISOTROPIC = "Isotropic"
BY_FILE = "By File"
BY_FILE = "ByFile"
HEMITROPIC = "Hemitropic"
SHORT_DIPOLE = "Short Dipole"
HALF_WAVE_DIPOLE = "Half-wave Dipole"
QUARTER_WAVE_MONOPOLE = "Quarter-wave Monopole"
WIRE_DIPOLE = "Wire Dipole"
WIRE_MONOPOLE = "Wire Monopole"
SMALL_LOOP = "Small Loop"
DIRECTIVE_BEAM = "Directive Beam"
PYRAMIDAL_HORN = "Pyramidal Horn"
SHORT_DIPOLE = "ShortDipole"
HALF_WAVE_DIPOLE = "HalfWaveDipole"
QUARTER_WAVE_MONOPOLE = "QuarterWaveMonopole"
WIRE_DIPOLE = "WireDipole"
WIRE_MONOPOLE = "WireMonopole"
SMALL_LOOP = "SmallLoop"
DIRECTIVE_BEAM = "DirectiveBeam"
PYRAMIDAL_HORN = "PyramidalHorn"

@property
def type(self) -> TypeOption:
def subtype(self) -> SubTypeOption:
"""Defines the type of antenna."""
val = self._get_property("Type")
val = self.TypeOption[val.upper()]
val = self._get_property("SubType")
val = self.SubTypeOption[val.upper()]
return val

@type.setter
def type(self, value: TypeOption):
self._set_property("Type", f"{value.value}")
@subtype.setter
def subtype(self, value: SubTypeOption):
self._set_property("SubType", f"{value.value}")

@property
def antenna_file(self) -> str:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@

class AntennaPassband(EmitNode):
def __init__(self, emit_obj, result_id, node_id):
self._is_component = False
EmitNode.__init__(self, emit_obj, result_id, node_id)
self._is_component = False

@property
def parent(self):
Expand All @@ -41,11 +41,11 @@ def node_type(self) -> str:
"""The type of this emit node."""
return self._node_type

def rename(self, new_name: str):
def rename(self, new_name: str = ""):
"""Rename this node"""
self._rename(new_name)

def duplicate(self, new_name: str):
def duplicate(self, new_name: str = ""):
"""Duplicate this node"""
return self._duplicate(new_name)

Expand All @@ -56,7 +56,7 @@ def delete(self):
@property
def enabled(self) -> bool:
"""Enabled state for this node."""
return self._get_property("Enabled")
return self._get_property("Enabled") == "true"

@enabled.setter
def enabled(self, value: bool):
Expand Down
Loading
Loading