Skip to content

Commit

Permalink
Polygon operations added (#4127)
Browse files Browse the repository at this point in the history
* move polygon method

* move polygon method

* polygon operation added
- move
- rotate
- scale

* polygon operation added
- move
- rotate
- scale

* Update pyaedt/edb_core/edb_data/primitives_data.py

Co-authored-by: SMoraisAnsys <[email protected]>

* Update pyaedt/edb_core/edb_data/primitives_data.py

Co-authored-by: SMoraisAnsys <[email protected]>

* Update pyaedt/edb_core/edb_data/primitives_data.py

Co-authored-by: SMoraisAnsys <[email protected]>

* Update pyaedt/edb_core/edb_data/primitives_data.py

Co-authored-by: SMoraisAnsys <[email protected]>

* Update pyaedt/edb_core/edb_data/primitives_data.py

Co-authored-by: SMoraisAnsys <[email protected]>

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* polygon operation added
- move
- rotate
- scale

---------

Co-authored-by: SMoraisAnsys <[email protected]>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
3 people authored Jan 25, 2024
1 parent f778b5a commit b597a6e
Show file tree
Hide file tree
Showing 2 changed files with 157 additions and 0 deletions.
25 changes: 25 additions & 0 deletions _unittest/test_00_EDB.py
Original file line number Diff line number Diff line change
Expand Up @@ -3217,3 +3217,28 @@ def test_161_create_polygon_check(self):
assert poly_test[0].center == [0.005, 0.005]
assert poly_test[0].bbox == [0.0, 0.0, 0.01, 0.01]
edbapp.close_edb()

def test_161_move_and_edit_polygons(self):
target_path = os.path.join(self.local_scratch.path, "test_move_edit_polygons", "test.aedb")
edbapp = Edb(target_path, edbversion=desktop_version)

edbapp.stackup.add_layer("GND")
edbapp.stackup.add_layer("Diel", "GND", layer_type="dielectric", thickness="0.1mm", material="FR4_epoxy")
edbapp.stackup.add_layer("TOP", "Diel", thickness="0.05mm")
points = [[0.0, -1e-3], [0.0, -10e-3], [100e-3, -10e-3], [100e-3, -1e-3], [0.0, -1e-3]]
polygon = edbapp.modeler.create_polygon(points, "TOP")
assert polygon.center == [0.05, -0.0055]
assert polygon.move(["1mm", 1e-3])
assert round(polygon.center[0], 6) == 0.051
assert round(polygon.center[1], 6) == -0.0045
assert polygon.rotate(angle=45)
assert polygon.bbox == [0.012462680425333156, -0.043037319574666846, 0.08953731957466685, 0.034037319574666845]
assert polygon.rotate(angle=34, center=[0, 0])
assert polygon.bbox == [0.03083951217158376, -0.025151830651067256, 0.05875505636026722, 0.07472816865208806]
assert polygon.scale(factor=1.5)
assert polygon.bbox == [0.0238606261244129, -0.05012183047685609, 0.06573394240743807, 0.09969816847787688]
assert polygon.scale(factor=-0.5, center=[0, 0])
assert polygon.bbox == [-0.032866971203719036, -0.04984908423893844, -0.01193031306220645, 0.025060915238428044]
assert polygon.move_layer("GND")
assert len(edbapp.modeler.polygons) == 1
assert edbapp.modeler.polygons[0].layer_name == "GND"
132 changes: 132 additions & 0 deletions pyaedt/edb_core/edb_data/primitives_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -1005,6 +1005,138 @@ def clone(self):
return cloned_poly
return False

@pyaedt_function_handler
def move(self, vector):
"""Move polygon along a vector.
Parameters
----------
vector : List of float or str [x,y].
Returns
-------
bool
``True`` when successful, ``False`` when failed.
Examples
--------
>>> edbapp = pyaedt.Edb("myproject.aedb")
>>> top_layer_polygon = [poly for poly in edbapp.modeler.polygons if poly.layer_name == "Top Layer"]
>>> for polygon in top_layer_polygon:
>>> polygon.move(vector=["2mm", "100um"])
"""
if vector and isinstance(vector, list) and len(vector) == 2:
_vector = self._edb.Geometry.PointData(
self._edb.Utility.Value(vector[0]), self._edb.Utility.Value(vector[1])
)
polygon_data = self._edb.Geometry.PolygonData.CreateFromArcs(self.polygon_data.edb_api.GetArcData(), True)
polygon_data.Move(_vector)
return self.api_object.SetPolygonData(polygon_data)
return False

@pyaedt_function_handler
def rotate(self, angle, center=None):
"""Rotate polygon around a center point by an angle
Parameters
----------
angle : float
Value of the rotation angle in degree.
center : List of float or str [x,y], optional
If None rotation is done from polygon center.
Returns
-------
bool
``True`` when successful, ``False`` when failed.
Examples
--------
>>> edbapp = pyaedt.Edb("myproject.aedb")
>>> top_layer_polygon = [poly for poly in edbapp.modeler.polygons if poly.layer_name == "Top Layer"]
>>> for polygon in top_layer_polygon:
>>> polygon.rotate(angle=45)
"""
if angle:
polygon_data = self._edb.Geometry.PolygonData.CreateFromArcs(self.polygon_data.edb_api.GetArcData(), True)
if not center:
center = polygon_data.GetBoundingCircleCenter()
if center:
polygon_data.Rotate(angle * math.pi / 180, center)
return self.api_object.SetPolygonData(polygon_data)
elif isinstance(center, list) and len(center) == 2:
center = self._edb.Geometry.PointData(
self._edb.Utility.Value(center[0]), self._edb.Utility.Value(center[1])
)
polygon_data.Rotate(angle * math.pi / 180, center)
return self.api_object.SetPolygonData(polygon_data)
return False

@pyaedt_function_handler
def scale(self, factor, center=None):
"""Scales the polygon relative to a center point by a factor.
Parameters
----------
factor : float
Scaling factor.
center : List of float or str [x,y], optional
If None scaling is done from polygon center.
Returns
-------
bool
``True`` when successful, ``False`` when failed.
Examples
--------
>>> edbapp = pyaedt.Edb("myproject.aedb")
>>> top_layer_polygon = [poly for poly in edbapp.modeler.polygons if poly.layer_name == "Top Layer"]
>>> for polygon in top_layer_polygon:
>>> polygon.scale(factor=2)
"""
if not isinstance(factor, str):
factor = float(factor)
polygon_data = self._edb.Geometry.PolygonData.CreateFromArcs(self.polygon_data.edb_api.GetArcData(), True)
if not center:
center = polygon_data.GetBoundingCircleCenter()
if center:
polygon_data.Scale(factor, center)
return self.api_object.SetPolygonData(polygon_data)
elif isinstance(center, list) and len(center) == 2:
center = self._edb.Geometry.PointData(
self._edb.Utility.Value(center[0]), self._edb.Utility.Value(center[1])
)
polygon_data.Scale(factor, center)
return self.api_object.SetPolygonData(polygon_data)
return False

@pyaedt_function_handler
def move_layer(self, layer):
"""Move polygon to given layer.
Parameters
----------
layer : str
layer name.
Returns
-------
bool
``True`` when successful, ``False`` when failed.
"""
if layer and isinstance(layer, str) and layer in self._pedb.stackup.signal_layers:
polygon_data = self._edb.Geometry.PolygonData.CreateFromArcs(self.polygon_data.edb_api.GetArcData(), True)
moved_polygon = self._pedb.modeler.create_polygon(
main_shape=polygon_data, net_name=self.net_name, layer_name=layer
)
if moved_polygon:
self.delete()
return True
return False

@pyaedt_function_handler()
def in_polygon(
self,
Expand Down

0 comments on commit b597a6e

Please sign in to comment.