Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c4b65a3
Create CCA from modeling region API + tests added
ansjdudkows Jul 5, 2024
4036ead
Fixed syntax errors in errors.py and project.py
ansjdudkows Jul 9, 2024
9208df0
test empty
ansjdudkows Jul 12, 2024
e6b5bc4
test
ansjdudkows Jul 12, 2024
4a90dc1
Test cases depending on connection now in conditional
ansjdudkows Jul 12, 2024
8606eed
documentation updates
ansjdudkows Jul 12, 2024
bcdfc13
Added successful run test
ansjdudkows Jul 12, 2024
2aec399
Changed the connection statement and took out successful run test
ansjdudkows Jul 15, 2024
e448e91
added test for missing parameters
ansjdudkows Jul 15, 2024
ceab93e
took out commented out section
ansjdudkows Jul 15, 2024
93b632c
Create CCA from modeling region API + tests added
ansjdudkows Jul 5, 2024
3a9f296
Fixed syntax errors in errors.py and project.py
ansjdudkows Jul 9, 2024
6af0d19
test empty
ansjdudkows Jul 12, 2024
950df67
test
ansjdudkows Jul 12, 2024
9abf347
Test cases depending on connection now in conditional
ansjdudkows Jul 12, 2024
06e8af8
documentation updates
ansjdudkows Jul 12, 2024
73b6582
Added successful run test
ansjdudkows Jul 12, 2024
2695de1
Changed the connection statement and took out successful run test
ansjdudkows Jul 15, 2024
be08a61
added test for missing parameters
ansjdudkows Jul 15, 2024
1b146c2
took out commented out section
ansjdudkows Jul 15, 2024
5c3f51f
Merge branch 'joe/create_cca_from_mr' of https://github.com/ansys/pys…
ansjdudkows Jul 15, 2024
72ea07e
Merge branch 'main' into joe/create_cca_from_mr
anskhanson Jul 15, 2024
3ed9eb0
Fix documentation error
ansjdudkows Jul 15, 2024
177a78e
Merge branch 'joe/create_cca_from_mr' of https://github.com/ansys/pys…
ansjdudkows Jul 15, 2024
86d92e3
test
ansjdudkows Jul 15, 2024
9e31009
fixed project name
ansjdudkows Jul 15, 2024
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
13 changes: 12 additions & 1 deletion src/ansys/sherlock/core/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -1133,7 +1133,6 @@ def str_itr(self):
"""Create list of error messages."""
if self.message is None:
return [f"Export test points error: {error}" for error in self.error_array]

assert self.error_array is None
return [f"Export test points error: {self.message}"]

Expand All @@ -1160,3 +1159,15 @@ def __init__(self, message):
def __str__(self):
"""Format error message."""
return f"Export mount points error: {self.message}"


class SherlockCreateCCAFromModelingRegionError(Exception):
"""Contains the error raised when a CCA cannot be created from a modeling region."""

def __init__(self, message):
"""Initialize error message."""
self.message = message

def __str__(self):
"""Format error message."""
return f"Create CCA from modeling region error: {self.message}"
162 changes: 162 additions & 0 deletions src/ansys/sherlock/core/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
SherlockAddProjectError,
SherlockAddStrainMapsError,
SherlockAddThermalMapsError,
SherlockCreateCCAFromModelingRegionError,
SherlockDeleteProjectError,
SherlockExportProjectError,
SherlockGenerateProjectReportError,
Expand Down Expand Up @@ -1793,3 +1794,164 @@ def export_project(
raise e

return response.value

def create_cca_from_modeling_region(self, project, cca_from_mr_properties):
"""Create one or more CCAs from modeling regions in a given project.

Parameters
----------
project : str
Name of the Sherlock project.
cca_from_mr_properties : list
List of CCAs to be to be created from modeling regions
consisting of these properties:

- cca_name : str
Name of the CCA.
- modeling_region_id : str
Name of the modeling region.
- description : str
Description of the CCA.
- default_solder_type: str
The default solder type. The default is ``None``.
- default_stencil_thickness: float
The default stencil thickness. The default is ``None``.
- default_stencil_thickness_units: str
Units for default stencil thickness. The default is ``None``.
- default_part_temp_rise: float
Default part temp rise. The default is ``None``.
- default_part_temp_rise_units: str
Units for default part temp rise. The default is ``None``.
Options are ``"C"``, ``"F"``, and ``"K"``.
- guess_part_properties: bool
Whether to enable guess part properties. The default is ``None``.
- generate_image_layers: bool
Whether to generate image layers or not. The default is ``None``.

Returns
-------
int
Status code of the response. 0 for success.

Examples
--------
>>> from ansys.sherlock.core.launcher import launch_sherlock
>>> sherlock = launch_sherlock()
>>> sherlock.project.import_odb_archive(
"ODB++ Tutorial.tgz",
True,
True,
True,
True,
project="Test",
cca_name="Card",
)
>>> sherlock.project.create_cca_from_modeling_region()
"Test",
[{
'cca_name': 'Card',
'modeling_region_id': 'MR1'
'description': 'Test',
'default_solder_type': 'SAC305',
'default_stencil_thickness': 10,
'default_stencil_thickness_units': 'mm',
'default_part_temp_rise': 20,
'default_part_temp_rise_units': 'C',
'guess_part_properties': False,
'generate_image_layers': False,
},
]
)
"""
try:
if project == "":
raise SherlockCreateCCAFromModelingRegionError(message="Project name is invalid.")

if not isinstance(cca_from_mr_properties, list):
raise SherlockCreateCCAFromModelingRegionError(
message="CCA properties argument is invalid."
)

if len(cca_from_mr_properties) == 0:
raise SherlockCreateCCAFromModelingRegionError(
message="One or more CCAs are required."
)

request = SherlockProjectService_pb2.CreateCcaFromModelingRegionRequest(project=project)

for i, cca in enumerate(cca_from_mr_properties):
cca_request = request.cCAsFromModelingRegions.add()

if not isinstance(cca, dict):
raise SherlockCreateCCAFromModelingRegionError(
message=f"CCA properties are invalid for CCA {i}."
)

if "cca_name" not in cca.keys():
raise SherlockCreateCCAFromModelingRegionError(
message=f"CCA name is missing for CCA {i}."
)

if "modeling_region_id" not in cca.keys():
raise SherlockCreateCCAFromModelingRegionError(
message=f"Modeling Region ID is missing for CCA {i}."
)

cca_request.ccaName = cca["cca_name"]
cca_request.modelingRegionID = cca["modeling_region_id"]

if cca_request.ccaName == "":
raise SherlockCreateCCAFromModelingRegionError(
message=f"CCA name is invalid for CCA {i}."
)

if cca_request.modelingRegionID == "":
raise SherlockCreateCCAFromModelingRegionError(
message=f"Modeling Region ID is invalid for CCA {i}."
)

if "description" in cca.keys():
cca_request.description = cca["description"]

if "default_solder_type" in cca.keys():
cca_request.defaultSolderType = cca["default_solder_type"]

if "default_stencil_thickness" in cca.keys():
cca_request.defaultStencilThickness = cca["default_stencil_thickness"]

if "default_stencil_thickness_units" in cca.keys():
cca_request.defaultStencilThicknessUnits = cca[
"default_stencil_thickness_units"
]

if "default_part_temp_rise" in cca.keys():
cca_request.defaultPartTempRise = cca["default_part_temp_rise"]

if "default_part_temp_rise_units" in cca.keys():
cca_request.defaultPartTempRiseUnits = cca["default_part_temp_rise_units"]

if "guess_part_properties" in cca.keys():
cca_request.guessPartProperties = cca["guess_part_properties"]

if "generate_image_layers" in cca.keys():
cca_request.generateImageLayers = cca["generate_image_layers"]

except SherlockCreateCCAFromModelingRegionError as e:
LOG.error(str(e))
raise e

if not self._is_connection_up():
LOG.error("There is no connection to a gRPC service.")
return

response = self.stub.createCCAFromModelingRegion(request)

try:
if response.value == -1:
raise SherlockCreateCCAFromModelingRegionError(response.message)
else:
LOG.info(response.message)
return response.value
except SherlockCreateCCAFromModelingRegionError as e:
LOG.error(str(e))
raise e
182 changes: 182 additions & 0 deletions tests/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
SherlockAddProjectError,
SherlockAddStrainMapsError,
SherlockAddThermalMapsError,
SherlockCreateCCAFromModelingRegionError,
SherlockDeleteProjectError,
SherlockExportProjectError,
SherlockGenerateProjectReportError,
Expand Down Expand Up @@ -61,6 +62,7 @@ def test_all():
helper_test_add_thermal_maps(project)
helper_test_update_thermal_maps(project)
helper_test_list_thermal_maps(project)
helper_test_create_cca_from_modeling_region(project)
project_name = None
try:
project_name = helper_test_add_project(project)
Expand Down Expand Up @@ -3066,5 +3068,185 @@ def helper_test_export_project(project):
pytest.fail(str(e))


def helper_test_create_cca_from_modeling_region(project):
"""Test create_cca_from_modeling_region API"""
try:
project.create_cca_from_modeling_region(
"",
[
{
"cca_name": "Main Board",
"modeling_region_id": "MR1",
"description": "test MR1",
"default_solder_type": "SAC305",
"default_stencil_thickness": 10,
"default_stencil_thickness_units": "mm",
"default_part_temp_rise": 20,
"default_part_temp_rise_units": "C",
"guess_part_properties_enabled": False,
"generate_image_layers": False,
},
],
)
assert False
except SherlockCreateCCAFromModelingRegionError as e:
assert str(e) == "Create CCA from modeling region error: Project " "name is invalid."

try:
project.create_cca_from_modeling_region("Test", "")
assert False
except SherlockCreateCCAFromModelingRegionError as e:
assert (
str(e) == "Create CCA from modeling region error: CCA "
"properties argument is invalid."
)

try:
project.create_cca_from_modeling_region("Test", [])
assert False
except SherlockCreateCCAFromModelingRegionError as e:
assert str(e) == "Create CCA from modeling region error: One or more CCAs are required."

try:
project.create_cca_from_modeling_region("Test", [""])
assert False
except SherlockCreateCCAFromModelingRegionError as e:
assert (
str(e) == "Create CCA from modeling region error: CCA properties "
"are invalid for CCA 0."
)

try:
project.create_cca_from_modeling_region(
"Test",
[
{
"modeling_region_id": "MR1",
"description": "tests MR1",
"default_solder_type": "SAC305",
"default_stencil_thickness": 10,
"default_stencil_thickness_units": "mm",
"default_part_temp_rise": 20,
"default_part_temp_rise_units": "C",
"guess_part_properties": False,
"generate_image_layers": False,
},
],
)
assert False
except SherlockCreateCCAFromModelingRegionError as e:
assert str(e) == "Create CCA from modeling region error: CCA name is missing for CCA 0."

try:
project.create_cca_from_modeling_region(
"Test",
[
{
"cca_name": "",
"modeling_region_id": "MR1",
"description": "Test",
"default_solder_type": "SAC305",
"default_stencil_thickness": 10,
"default_stencil_thickness_units": "mm",
"default_part_temp_rise": 20,
"default_part_temp_rise_units": "C",
"guess_part_properties": False,
"generate_image_layers": False,
},
],
)
assert False
except SherlockCreateCCAFromModelingRegionError as e:
assert str(e) == "Create CCA from modeling region error: CCA name is invalid for CCA 0."

try:
project.create_cca_from_modeling_region(
"Test",
[
{
"cca_name": "Main Board",
"description": "Test",
"default_solder_type": "SAC305",
"default_stencil_thickness": 10,
"default_stencil_thickness_units": "mm",
"default_part_temp_rise": 20,
"default_part_temp_rise_units": "C",
"guess_part_properties": False,
"generate_image_layers": False,
},
],
)
assert False
except SherlockCreateCCAFromModelingRegionError as e:
assert (
str(e) == "Create CCA from modeling region error: Modeling Region ID"
" is missing for CCA 0."
)

try:
project.create_cca_from_modeling_region(
"Test",
[
{
"cca_name": "Card",
"modeling_region_id": "",
"description": "Test",
"default_solder_type": "SAC305",
"default_stencil_thickness": 10,
"default_stencil_thickness_units": "mm",
"default_part_temp_rise": 20,
"default_part_temp_rise_units": "C",
"guess_part_properties": False,
"generate_image_layers": False,
},
],
)
assert False
except SherlockCreateCCAFromModelingRegionError as e:
assert (
str(e) == "Create CCA from modeling region error: Modeling Region ID"
" is invalid for CCA 0."
)

if not project._is_connection_up():
return

try:
project.create_cca_from_modeling_region(
"Tutorial Project",
[
{
"cca_name": "Main Board",
"modeling_region_id": "MR1",
"description": "Test",
"default_solder_type": "SAC305",
"default_stencil_thickness": 10,
"default_stencil_thickness_units": "INVALID",
"default_part_temp_rise": 20,
"default_part_temp_rise_units": "C",
"guess_part_properties": False,
"generate_image_layers": False,
},
],
)
pytest.fail("No exception raised when using an invalid parameter")
except Exception as e:
assert type(e) == SherlockCreateCCAFromModelingRegionError

try:
project.create_cca_from_modeling_region(
"ModelingRegion",
[
{
"cca_name": "Main Board",
"modeling_region_id": "MR1",
},
],
)
pytest.fail("No exception raised when parameters are missing")
except Exception as e:
assert type(e) == SherlockCreateCCAFromModelingRegionError


if __name__ == "__main__":
test_all()