Skip to content
Draft
164 changes: 97 additions & 67 deletions examples/05-electrothermal/ecad_import.py
Original file line number Diff line number Diff line change
@@ -1,114 +1,144 @@
# # Importing a PCB and its components via IDF and EDB
# # Import an ECAD into Icepak and modify stackup properties

# This example shows how to import a PCB and its components using IDF files (*.ldb/*.bdf).
# The *.emn/*.emp combination can also be used in a similar way.
# This example shows how to import an ECAD as a PCB component into Icepak.
# It will also demonstrate how to change the materials of the PCB layers and
# update the PCB in Icepak.
#
# Keywords: **Icepak**, **PCB**, **IDF**.
# Keywords: **Icepak**, **PCB**

# ## Perform required imports
#
# Perform required imports including the operating system, Ansys PyAEDT packages.

import os
import tempfile
import time
import tempfile

import ansys.aedt.core
from ansys.aedt.core import Hfss3dLayout, Icepak

# ## Define constants
# Define constants

AEDT_VERSION = "2024.2"
NG_MODE = False # Open Electronics UI when the application is launched.
NG_MODE = False # Open AEDT user interface when False

# ## Open project
# ## Create temporary directory
#
# Open an empty project in non-graphical mode, using a temporary folder.
# Open an empty project in graphical mode, using a temporary directory.
# If you'd like to retrieve the project data for subsequent use,
# the temporary folder name is given by ``temp_folder.name``.

# +
temp_folder = tempfile.TemporaryDirectory(suffix=".ansys")

ipk = Icepak(
project=os.path.join(temp_folder.name, "Icepak_ECAD_Import.aedt"),

# ## Launch Icepak and open project
#
# Launch HFSS and open the project

# +
project_name = "Icepak_ECAD_Import"
project_path = os.path.join(temp_folder.name, f"{project_name}.aedt")
ipk = ansys.aedt.core.Icepak(
project=project_name,
version=AEDT_VERSION,
new_desktop=True,
non_graphical=NG_MODE,
)
# -

# ## Import the IDF files
#
# Sample *.bdf and *.ldf files are presented here.
#
# <img src="_static\bdf.png" width="400">
#
# <img src="_static\ldf.png" width="400">
#
# Imports the idf files with several filtering options including caps, resistors,
# inductors, power, specific power, size...
# There are also options for the PCB creation (number o flayers, copper percentages, layer sizes).
# In this example, the default values are used for the PCB.
# The imported PCB (from IDF) here will be deleted later and replaced by a PCB that has the trace
# information (from ECAD) for higher accuracy.
print(f"Project name: {project_name}")

# Download ECAD and IDF files
# Disable autosave
ipk.autosave_disable()

def_path = ansys.aedt.core.downloads.download_file(
source="icepak/Icepak_ECAD_Import/A1_uprev.aedb",
# Save Icepak project
ipk.save_project()
# -

# ## Download the ECAD file
# Download the ECAD file needed to run the example.

ecad_path = ansys.aedt.core.downloads.download_file(
source="edb/ANSYS-HSD_V1.aedb",
name="edb.def",
destination=temp_folder.name,
)
board_path = ansys.aedt.core.downloads.download_file(
source="icepak/Icepak_ECAD_Import/", name="A1.bdf", destination=temp_folder.name

# ## Import ECAD
# Add an HFSS 3D Layout design with the layout information of the PCB.
h3d_design_name = "PCB_TEMP"
h3d = ansys.aedt.core.Hfss3dLayout(
project=project_name,
design=h3d_design_name,
version=AEDT_VERSION,
)
library_path = ansys.aedt.core.downloads.download_file(
source="icepak/Icepak_ECAD_Import/", name="A1.ldf", destination=temp_folder.name
# Import EDB file
h3d.import_edb(ecad_path)

# Save 3D Layout project
h3d.save_project()

# Delete the empty placeholder HFSS 3D layout design
ipk.delete_design(name=h3d_design_name, fallback_design=None)

# Set component name, ECAD source name and ECAD project path to be linked to Icepak
component_name = "PCB_ECAD"
layout_name = h3d.design_name
ecad_source = os.path.join(h3d.project_path, f"{h3d.project_name}.aedt")

# ## Create PCB component in Icepak
# Create a PCB component in Icepak linked to the 3D Layout project.
# Polygon ``"poly_5949"`` is used as the outline of the PCB and
# a dissipation of ``"1W"`` is applied to the PCB.

pcb_comp = ipk.create_pcb_from_3dlayout(
component_name=component_name,
project_name=ecad_source,
design_name=layout_name,
resolution=3,
extent_type="Polygon",
outline_polygon="poly_5949",
power_in=1,
)

# Import IDF

ipk.import_idf(board_path=board_path)

# Save the project

# Save project
ipk.save_project()

# ## Import ECAD
# Add an HFSS 3D Layout design with the layout information of the PCB
# ## Modify PCB stackup
# Initialize PyEDB object to modify ECAD
edb = ansys.aedt.core.Edb(edbpath=ecad_path, edbversion=AEDT_VERSION)

hfss3d_lo = Hfss3dLayout(project=def_path, version=AEDT_VERSION)
hfss3d_lo.save_project()
# Change dielectric fill in signal layers
for name, layer in edb.stackup.signal_layers.items():
layer.dielectric_fill = "FR4_epoxy"

# Create a PCB component in Icepak linked to the 3D Layout project. The polygon ``"poly_0"``
# is used as the outline of the PCB and a dissipation of ``"1W"`` is applied to the PCB.
# Change material of dielectric layers
for name, layer in edb.stackup.dielectric_layers.items():
layer.material = "FR4_epoxy"

ipk.create_pcb_from_3dlayout(
component_name="PCB_pyAEDT",
project_name=hfss3d_lo.project_file,
design_name=hfss3d_lo.design_name,
extenttype="Polygon",
outlinepolygon="poly_0",
power_in=1,
)
# Save EDB
edb.save_edb()

# Delete the simplified PCB object coming from IDF import.
# Close edb session
edb.close_edb()

ipk.modeler["IDF_BoardOutline"].delete()
# Update layers of PCB with new materials in PCB component
pcb_comp.update()

# ## Plot model
# ## Modify PCB materials in Icepak
# Change properties of PCB component such as board cutout material and via fill material
pcb_comp.board_cutout_material = "FR4_epoxy"
pcb_comp.via_holes_material = "FR4_epoxy"

ipk.plot(
show=False,
export_path=os.path.join(temp_folder.name, "ECAD_import.jpg"),
plot_air_objects=False,
force_opacity_value=1,
)
# Modify the power specified on PCB
pcb_comp.power = "2W"

# ## Release AEDT
# Print path of the linked ECAD source defintion
print(pcb_comp.native_properties["DefnLink"]["Project"])

# ## Save project and release desktop
ipk.save_project()
ipk.release_desktop()
# Wait 3 seconds to allow Electronics Desktop to shut down before cleaning the temporary directory.

# Wait 3 seconds to allow Electronics Desktop to shut down
# before cleaning the temporary directory.
time.sleep(3)

# ## Cleanup
Expand Down