From 0faf92870162b91571e0e4b3260271187f224e75 Mon Sep 17 00:00:00 2001
From: Hui Zhou <ring630@gmail.com>
Date: Tue, 12 Nov 2024 16:23:12 +0100
Subject: [PATCH 1/4] DOCS: configure layout doc (#5409)

Co-authored-by: ring630 <@gmail.com>
---
 .../project/configure_edb.rst                 | 22 ++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/doc/source/User_guide/pyaedt_extensions_doc/project/configure_edb.rst b/doc/source/User_guide/pyaedt_extensions_doc/project/configure_edb.rst
index d8317179049..077094fa6e2 100644
--- a/doc/source/User_guide/pyaedt_extensions_doc/project/configure_edb.rst
+++ b/doc/source/User_guide/pyaedt_extensions_doc/project/configure_edb.rst
@@ -18,10 +18,6 @@ integrity as well as power integrity analysis.
   :width: 800
   :alt: Principle of working of Layout UI
 
-Please refer to EDB Configuration `User Guide`_ for details
-
-.. _User Guide: https://edb.docs.pyansys.com/version/stable/examples/use_configuration/index.html
-
 --------------------------------------------------------------------------
 A brief description of which options are defined in the configuration file
 --------------------------------------------------------------------------
@@ -83,4 +79,20 @@ Configure design in siwave project
 
 3, Click ``Select and Apply Configuration`` and browse to your configuration files.
 
-4, In the second pop-up window. Specify where to save the new project.
\ No newline at end of file
+4, In the second pop-up window. Specify where to save the new project.
+
+~~~~~~~~~
+Resources
+~~~~~~~~~
+
+1, EDB Configuration `User Guide`_ for details
+
+.. _User Guide: https://edb.docs.pyansys.com/version/stable/examples/use_configuration/index.html
+
+2, `Demo video`_
+
+.. _Demo video: https://www.linkedin.com/posts/electronics-simulation_accelerate-hfss-configuration-via-ansys-pyedb-activity-7252325488168177666-ypbN/?utm_source=share&utm_medium=member_desktop
+
+3, `Webinar Automating Signal and Power Integrity workflow with PyAEDT`_
+
+.. _Webinar Automating Signal and Power Integrity workflow with PyAEDT: https://www.ansys.com/webinars/automating-signal-power-integrity-workflow-pyaedt?campaignID=7013g000000Y8uOAAS&utm_campaign=product&utm_content=digital_electronics_oktopost-Ansys+Electronics_oktopost-%25campaign_n&utm_medium=social-organic&utm_source=LinkedIn
\ No newline at end of file

From f73c6c9387593397daff19498c0610ff25527b20 Mon Sep 17 00:00:00 2001
From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com>
Date: Tue, 12 Nov 2024 18:27:01 +0100
Subject: [PATCH 2/4] FIX: Fix hardcoded path (#5414)

---
 .../core/workflows/templates/run_extension_manager.py_build   | 4 ++--
 .../workflows/templates/run_pyaedt_toolkit_script.py_build    | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/ansys/aedt/core/workflows/templates/run_extension_manager.py_build b/src/ansys/aedt/core/workflows/templates/run_extension_manager.py_build
index 8ec46c8c71f..0d831bc42a4 100644
--- a/src/ansys/aedt/core/workflows/templates/run_extension_manager.py_build
+++ b/src/ansys/aedt/core/workflows/templates/run_extension_manager.py_build
@@ -50,10 +50,10 @@ def main():
             # Get AEDT version
             version_short = oDesktop.GetVersion()[2:6].replace(".", "")
             # Launch extension manager
-            python_exe = r"C:\Users\smorais\AppData\Roaming\.pyaedt_env\3_10\Scripts\python.exe"
+            python_exe = r"##PYTHON_EXE##" % version
             # Extensions directory
             current_dir = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
-            pyaedt_extensions_dir = os.path.normpath(os.path.join(current_dir, r"Lib"))
+            pyaedt_extensions_dir = os.path.normpath(os.path.join(current_dir, r"##TOOLKIT_REL_LIB_DIR##"))
             pyaedt_script = os.path.join(pyaedt_extensions_dir, "extension_manager.py")
             # Check if CPython interpreter and AEDT release match
             python_exe = pyaedt_utils.sanitize_interpreter_path(python_exe, version_short)
diff --git a/src/ansys/aedt/core/workflows/templates/run_pyaedt_toolkit_script.py_build b/src/ansys/aedt/core/workflows/templates/run_pyaedt_toolkit_script.py_build
index 56216d02a61..aa624beffdc 100644
--- a/src/ansys/aedt/core/workflows/templates/run_pyaedt_toolkit_script.py_build
+++ b/src/ansys/aedt/core/workflows/templates/run_pyaedt_toolkit_script.py_build
@@ -34,7 +34,7 @@ is_linux = os.name == "posix"
 if is_linux:
     import subprocessdotnet as subprocess
 
-toolkits_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+toolkits_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
 
 sys.path.append(toolkits_dir)
 

From 2805e17ca64fe58f16ce012c0f54c8e7ffcb2471 Mon Sep 17 00:00:00 2001
From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com>
Date: Wed, 13 Nov 2024 17:32:22 +0100
Subject: [PATCH 3/4] FEAT: Material appearance (#5427)

Co-authored-by: atlanswer <i@atlanswer.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
---
 src/ansys/aedt/core/modeler/cad/object_3d.py  | 40 +++++++++++++++++++
 src/ansys/aedt/core/modeler/cad/primitives.py |  6 ++-
 tests/system/general/test_07_Object3D.py      |  2 +-
 tests/system/general/test_08_Primitives3D.py  |  6 +++
 4 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/src/ansys/aedt/core/modeler/cad/object_3d.py b/src/ansys/aedt/core/modeler/cad/object_3d.py
index d5e53ff5d32..364d4b56138 100644
--- a/src/ansys/aedt/core/modeler/cad/object_3d.py
+++ b/src/ansys/aedt/core/modeler/cad/object_3d.py
@@ -98,6 +98,7 @@ def __init__(self, primitives, name=None):
         self._surface_material = None
         self._color = None
         self._wireframe = None
+        self._material_appearance = None
         self._part_coordinate_system = None
         self._model = None
         self._m_groupName = None
@@ -1342,6 +1343,45 @@ def display_wireframe(self, fWireframe):
         self._change_property(vWireframe)
         self._wireframe = fWireframe
 
+    @property
+    def material_appearance(self):
+        """Material appearance property of the part.
+
+        Returns
+        -------
+        bool
+            ``True`` when material appearance is activated for the part, ``False`` otherwise.
+
+        References
+        ----------
+
+        >>> oEditor.GetPropertyValue
+        >>> oEditor.ChangeProperty
+
+        """
+        if self._material_appearance is not None:
+            return self._material_appearance
+        if "Material Appearance" in self.valid_properties:
+            material_appearance = self._oeditor.GetPropertyValue(
+                "Geometry3DAttributeTab", self._m_name, "Material Appearance"
+            )
+            if material_appearance == "true" or material_appearance == "True":
+                self._material_appearance = True
+            else:
+                self._material_appearance = False
+            return self._material_appearance
+
+    @material_appearance.setter
+    def material_appearance(self, material_appearance):
+        vMaterialAppearance = [
+            "NAME:Material Appearance",
+            "Value:=",
+            material_appearance,
+        ]
+
+        self._change_property(vMaterialAppearance)
+        self._material_appearance = material_appearance
+
     @pyaedt_function_handler()
     def history(self):
         """Object history.
diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py
index a4198684c54..48be85d11f3 100644
--- a/src/ansys/aedt/core/modeler/cad/primitives.py
+++ b/src/ansys/aedt/core/modeler/cad/primitives.py
@@ -6311,7 +6311,11 @@ def update_geometry_property(self, assignment, name=None, value=None):
             "solve_inside": {"property_name": "Solve Inside", "reset_attr": ["_solve_inside"]},
             "color": {"property_name": "Color", "reset_attr": ["_color"]},
             "transparency": {"property_name": "Transparent", "reset_attr": ["_transparency"]},
-            "part_coordinate_system": {"property_name": "Orientation", "reset_attr": ["_part_coordinate_system"]},
+            "part_coordinate_system": {
+                "property_name": "Orientation",
+                "reset_attr": ["_part_coordinate_system"],
+            },
+            "material_appearance": {"property_name": "Material Appearance", "reset_attr": ["_material_appearance"]},
         }
 
         # Check if property name is valid
diff --git a/tests/system/general/test_07_Object3D.py b/tests/system/general/test_07_Object3D.py
index 3d31f82d27f..f40858e3a91 100644
--- a/tests/system/general/test_07_Object3D.py
+++ b/tests/system/general/test_07_Object3D.py
@@ -241,6 +241,7 @@ def test_07_object_clone_and_get_properties(self):
         assert new_object.solve_inside == initial_object.solve_inside
         assert new_object.model == initial_object.model
         assert new_object.display_wireframe == initial_object.display_wireframe
+        assert new_object.material_appearance == initial_object.material_appearance
         assert new_object.part_coordinate_system == initial_object.part_coordinate_system
         assert new_object.transparency == 0.76
         assert new_object.color == initial_object.color
@@ -248,7 +249,6 @@ def test_07_object_clone_and_get_properties(self):
         assert len(new_object.vertices) == 8
         assert len(new_object.faces) == 6
         assert len(new_object.edges) == 12
-        assert new_object.display_wireframe == initial_object.display_wireframe
         new_object.name = "Properties_Box"
         assert not new_object.name == "Properties_Box"
 
diff --git a/tests/system/general/test_08_Primitives3D.py b/tests/system/general/test_08_Primitives3D.py
index baff07f0c44..9fef8369acc 100644
--- a/tests/system/general/test_08_Primitives3D.py
+++ b/tests/system/general/test_08_Primitives3D.py
@@ -2071,3 +2071,9 @@ def test_95_update_geometry_property(self):
         self.aedtapp.modeler.update_geometry_property([box2.name], "part_coordinate_system", cs.name)
         assert box2.part_coordinate_system == cs.name
         assert box1.part_coordinate_system == "Global"
+
+        self.aedtapp.modeler.update_geometry_property([box1.name], "material_appearance", True)
+        assert box1.material_appearance
+
+        self.aedtapp.modeler.update_geometry_property([box1.name, box2.name], "material_appearance", True)
+        assert box2.material_appearance

From aa3f648560c4c1e6739a6371792c093a58d8187e Mon Sep 17 00:00:00 2001
From: Ramin Aghajafari <153928265+ramin4667@users.noreply.github.com>
Date: Thu, 14 Nov 2024 02:11:53 -0500
Subject: [PATCH 4/4] FIX: FilterSolutions Sphinx Update (#5425)

---
 doc/source/API/Application.rst         |  1 -
 doc/source/API/FilterSolutions.rst     | 41 ++++++++++++++++++++++++++
 doc/source/API/index.rst               |  2 +-
 src/ansys/aedt/core/filtersolutions.py |  2 +-
 4 files changed, 43 insertions(+), 3 deletions(-)
 create mode 100644 doc/source/API/FilterSolutions.rst

diff --git a/doc/source/API/Application.rst b/doc/source/API/Application.rst
index d7ad0ed6724..74951455342 100644
--- a/doc/source/API/Application.rst
+++ b/doc/source/API/Application.rst
@@ -27,7 +27,6 @@ Available PyAEDT apps are:
    ansys.aedt.core.maxwellcircuit.MaxwellCircuit
    ansys.aedt.core.emit.Emit
    ansys.aedt.core.twinbuilder.TwinBuilder
-   ansys.aedt.core.filtersolutions.FilterSolutions
 
 
 All other classes and methods are inherited into the app class.
diff --git a/doc/source/API/FilterSolutions.rst b/doc/source/API/FilterSolutions.rst
new file mode 100644
index 00000000000..d8b84f5a181
--- /dev/null
+++ b/doc/source/API/FilterSolutions.rst
@@ -0,0 +1,41 @@
+Filter solutions
+==========================
+The ``FilterSolutions`` module contains all classes needed to create and edit an object including. 
+
+
+* ``Attributes`` to defines attributes and parameters of filters.
+* ``DllInterface`` to interface with the FilterSolutions DLL.
+* ``GraphSetup`` to define the frequency and time limits of the exported responses.
+* ``IdealResponse`` to return the data for available ideal filter responses.
+* ``MultipleBandsTable`` to manipulate access to the entries of multiple bands table.
+* ``TransmissionZeros`` to manipulates access to ratio and bandwidth entries in the transmission zeros table.
+* ``LumpedTopology`` to define attributes and parameters of filters implemented with lumped topology.
+* ``LumpedParasitics`` to define attributes of the lumped element parasitic values.
+* ``LumpedNodesandLeads`` to define attributes of the lumped node capacitors and lead inductors.
+* ``LumpedTerminationImpedance`` to manipulate access to the entries of source and load complex impedance table.
+* ``ExportToAedt`` to define attributes and parameters of the export page for exporting to AEDT.
+* ``OptimizationGoalsTable`` to manipulate access to the entries of the optimization goals table.
+
+
+
+They are accessible through:
+
+
+.. currentmodule:: ansys.aedt.core.filtersolutions_core
+
+.. autosummary::
+   :toctree: _autosummary
+   :nosignatures:
+
+   attributes.Attributes
+   dll_interface.DllInterface
+   graph_setup.GraphSetup
+   ideal_response.IdealResponse
+   multiple_bands_table.MultipleBandsTable
+   transmission_zeros.TransmissionZeros
+   lumped_topology.LumpedTopology
+   lumped_parasitics.LumpedParasitics
+   lumped_nodes_and_leads.LumpedNodesandLeads
+   lumped_termination_impedance_table.LumpedTerminationImpedance
+   export_to_aedt.ExportToAedt
+   optimization_goals_table.OptimizationGoalsTable
diff --git a/doc/source/API/index.rst b/doc/source/API/index.rst
index 0d7dbde7ad4..c97cddcdc19 100644
--- a/doc/source/API/index.rst
+++ b/doc/source/API/index.rst
@@ -98,7 +98,7 @@ Example with ``Desktop`` class implicit initialization:
    Configuration
    SetupTemplates
    CableModeling
-
+   FilterSolutions
 
 
 
diff --git a/src/ansys/aedt/core/filtersolutions.py b/src/ansys/aedt/core/filtersolutions.py
index 4b65297c319..df733dc0fae 100644
--- a/src/ansys/aedt/core/filtersolutions.py
+++ b/src/ansys/aedt/core/filtersolutions.py
@@ -40,7 +40,7 @@
 
 
 class FilterSolutions:
-    """Provides the ``FilterSolutions`` application interface.
+    """Provides the FilterSolutions application interface.
 
     This class has access to ideal filter attributes and calculated output parameters.