pyedb 0.31.0__py3-none-any.whl → 0.34.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pyedb might be problematic. Click here for more details.

Files changed (32) hide show
  1. pyedb/__init__.py +1 -27
  2. pyedb/common/__init__.py +0 -0
  3. pyedb/common/nets.py +488 -0
  4. pyedb/configuration/cfg_common.py +20 -0
  5. pyedb/configuration/cfg_components.py +218 -57
  6. pyedb/configuration/cfg_data.py +6 -0
  7. pyedb/configuration/cfg_modeler.py +139 -0
  8. pyedb/configuration/cfg_operations.py +5 -4
  9. pyedb/configuration/cfg_padstacks.py +319 -55
  10. pyedb/configuration/cfg_ports_sources.py +99 -7
  11. pyedb/configuration/cfg_s_parameter_models.py +6 -6
  12. pyedb/configuration/configuration.py +31 -9
  13. pyedb/dotnet/clr_module.py +92 -32
  14. pyedb/dotnet/edb.py +54 -5
  15. pyedb/dotnet/edb_core/cell/hierarchy/component.py +0 -202
  16. pyedb/dotnet/edb_core/cell/layout.py +1 -1
  17. pyedb/dotnet/edb_core/cell/primitive/primitive.py +5 -27
  18. pyedb/dotnet/edb_core/edb_data/control_file.py +21 -0
  19. pyedb/dotnet/edb_core/edb_data/layer_data.py +60 -6
  20. pyedb/dotnet/edb_core/edb_data/nets_data.py +6 -1
  21. pyedb/dotnet/edb_core/edb_data/padstacks_data.py +16 -222
  22. pyedb/dotnet/edb_core/edb_data/primitives_data.py +31 -0
  23. pyedb/dotnet/edb_core/hfss.py +2 -2
  24. pyedb/dotnet/edb_core/layout_validation.py +1 -3
  25. pyedb/dotnet/edb_core/materials.py +38 -38
  26. pyedb/dotnet/edb_core/modeler.py +4 -1
  27. pyedb/dotnet/edb_core/nets.py +2 -373
  28. pyedb/generic/filesystem.py +2 -5
  29. {pyedb-0.31.0.dist-info → pyedb-0.34.1.dist-info}/METADATA +12 -9
  30. {pyedb-0.31.0.dist-info → pyedb-0.34.1.dist-info}/RECORD +32 -29
  31. {pyedb-0.31.0.dist-info → pyedb-0.34.1.dist-info}/WHEEL +1 -1
  32. {pyedb-0.31.0.dist-info → pyedb-0.34.1.dist-info}/LICENSE +0 -0
@@ -503,7 +503,16 @@ class StackupLayerEdbClass(LayerEdbClass):
503
503
 
504
504
  @top_hallhuray_nodule_radius.setter
505
505
  def top_hallhuray_nodule_radius(self, value):
506
- self._top_hallhuray_nodule_radius = value
506
+ top_roughness_model = self.get_roughness_model("top")
507
+ if top_roughness_model:
508
+ if str(top_roughness_model).split(".")[-1] == "HurrayRoughnessModel":
509
+ layer_clone = self._edb_layer
510
+ layer_clone.SetTopRoughnessEnabled(True)
511
+ self._top_hallhuray_nodule_radius = value
512
+ top_roughness_model.NoduleRadius = self._pedb.edb_value(value)
513
+ region = top_roughness_model.Region.Top
514
+ layer_clone.SetRoughnessModel(region, top_roughness_model)
515
+ self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
507
516
 
508
517
  @property
509
518
  def top_hallhuray_surface_ratio(self):
@@ -515,7 +524,16 @@ class StackupLayerEdbClass(LayerEdbClass):
515
524
 
516
525
  @top_hallhuray_surface_ratio.setter
517
526
  def top_hallhuray_surface_ratio(self, value):
518
- self._top_hallhuray_surface_ratio = value
527
+ top_roughness_model = self.get_roughness_model("top")
528
+ if top_roughness_model:
529
+ if str(top_roughness_model).split(".")[-1] == "HurrayRoughnessModel":
530
+ layer_clone = self._edb_layer
531
+ layer_clone.SetTopRoughnessEnabled(True)
532
+ self._top_hallhuray_surface_ratio = value
533
+ top_roughness_model.SurfaceRatio = self._pedb.edb_value(value)
534
+ region = top_roughness_model.Region.Top
535
+ layer_clone.SetRoughnessModel(region, top_roughness_model)
536
+ self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
519
537
 
520
538
  @property
521
539
  def bottom_hallhuray_nodule_radius(self):
@@ -527,7 +545,16 @@ class StackupLayerEdbClass(LayerEdbClass):
527
545
 
528
546
  @bottom_hallhuray_nodule_radius.setter
529
547
  def bottom_hallhuray_nodule_radius(self, value):
530
- self._bottom_hallhuray_nodule_radius = value
548
+ bottom_roughness_model = self.get_roughness_model("bottom")
549
+ if bottom_roughness_model:
550
+ if str(bottom_roughness_model).split(".")[-1] == "HurrayRoughnessModel":
551
+ layer_clone = self._edb_layer
552
+ layer_clone.SetBottomRoughnessEnabled(True)
553
+ self._bottom_hallhuray_nodule_radius = value
554
+ bottom_roughness_model.NoduleRadius = self._pedb.edb_value(value)
555
+ region = bottom_roughness_model.Region.Bottom
556
+ layer_clone.SetRoughnessModel(region, bottom_roughness_model)
557
+ self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
531
558
 
532
559
  @property
533
560
  def bottom_hallhuray_surface_ratio(self):
@@ -539,7 +566,16 @@ class StackupLayerEdbClass(LayerEdbClass):
539
566
 
540
567
  @bottom_hallhuray_surface_ratio.setter
541
568
  def bottom_hallhuray_surface_ratio(self, value):
542
- self._bottom_hallhuray_surface_ratio = value
569
+ bottom_roughness_model = self.get_roughness_model("bottom")
570
+ if bottom_roughness_model:
571
+ if str(bottom_roughness_model).split(".")[-1] == "HurrayRoughnessModel":
572
+ layer_clone = self._edb_layer
573
+ layer_clone.SetBottomRoughnessEnabled(True)
574
+ self._bottom_hallhuray_surface_ratio = value
575
+ bottom_roughness_model.SurfaceRatio = self._pedb.edb_value(value)
576
+ region = bottom_roughness_model.Region.Bottom
577
+ layer_clone.SetRoughnessModel(region, bottom_roughness_model)
578
+ self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
543
579
 
544
580
  @property
545
581
  def side_hallhuray_nodule_radius(self):
@@ -551,7 +587,16 @@ class StackupLayerEdbClass(LayerEdbClass):
551
587
 
552
588
  @side_hallhuray_nodule_radius.setter
553
589
  def side_hallhuray_nodule_radius(self, value):
554
- self._side_hallhuray_nodule_radius = value
590
+ side_roughness_model = self.get_roughness_model("side")
591
+ if side_roughness_model:
592
+ if str(side_roughness_model).split(".")[-1] == "HurrayRoughnessModel":
593
+ layer_clone = self._edb_layer
594
+ layer_clone.SetRoughnessEnabled(True)
595
+ self._side_hallhuray_nodule_radius = value
596
+ side_roughness_model.NoduleRadius = self._pedb.edb_value(value)
597
+ region = side_roughness_model.Region.Side
598
+ layer_clone.SetRoughnessModel(region, side_roughness_model)
599
+ self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
555
600
 
556
601
  @property
557
602
  def side_hallhuray_surface_ratio(self):
@@ -563,7 +608,16 @@ class StackupLayerEdbClass(LayerEdbClass):
563
608
 
564
609
  @side_hallhuray_surface_ratio.setter
565
610
  def side_hallhuray_surface_ratio(self, value):
566
- self._side_hallhuray_surface_ratio = value
611
+ side_roughness_model = self.get_roughness_model("side")
612
+ if side_roughness_model:
613
+ if str(side_roughness_model).split(".")[-1] == "HurrayRoughnessModel":
614
+ layer_clone = self._edb_layer
615
+ layer_clone.SetRoughnessEnabled(True)
616
+ self._side_hallhuray_surface_ratio = value
617
+ side_roughness_model.SurfaceRatio = self._pedb.edb_value(value)
618
+ region = side_roughness_model.Region.Side
619
+ layer_clone.SetRoughnessModel(region, side_roughness_model)
620
+ self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
567
621
 
568
622
  def get_roughness_model(self, surface="top"):
569
623
  """Get roughness model of the layer.
@@ -113,8 +113,9 @@ class EDBNetsData(NetDotNet):
113
113
  show_legend=True,
114
114
  save_plot=None,
115
115
  outline=None,
116
- size=(2000, 1000),
116
+ size=(6000, 3000),
117
117
  show=True,
118
+ plot_vias=True,
118
119
  ):
119
120
  """Plot a net to Matplotlib 2D chart.
120
121
 
@@ -134,6 +135,9 @@ class EDBNetsData(NetDotNet):
134
135
  Image size in pixel (width, height).
135
136
  show : bool, optional
136
137
  Whether to show the plot or not. Default is `True`.
138
+ plot_vias : bool, optional
139
+ Whether to plot vias or not. It may impact on performances.
140
+ Default is `True`.
137
141
  """
138
142
 
139
143
  return self._app.nets.plot(
@@ -144,6 +148,7 @@ class EDBNetsData(NetDotNet):
144
148
  outline=outline,
145
149
  size=size,
146
150
  show=show,
151
+ plot_vias=plot_vias,
147
152
  )
148
153
 
149
154
  def get_smallest_trace_width(self):
@@ -411,17 +411,6 @@ class EDBPadstack(object):
411
411
  >>> edb_padstack = edb.padstacks.definitions["MyPad"]
412
412
  """
413
413
 
414
- PAD_SHAPE_PARAMETERS = {
415
- "circle": ["diameter"],
416
- "square": ["size"],
417
- "rectangle": ["x_size", "y_size"],
418
- "oval": ["x_size", "y_size", "corner_radius"],
419
- "bullet": ["x_size", "y_size", "corner_radius"],
420
- "round45": ["inner", "channel_width", "isolation_gap"],
421
- "round90": ["inner", "channel_width", "isolation_gap"],
422
- "no_geometry": [],
423
- }
424
-
425
414
  def __init__(self, edb_padstack, ppadstack):
426
415
  self._edb_object = edb_padstack
427
416
  self.edb_padstack = edb_padstack
@@ -468,175 +457,6 @@ class EDBPadstack(object):
468
457
  def _padstack_def_data(self, value):
469
458
  self._edb_object.SetData(value)
470
459
 
471
- @property
472
- def pad_parameters(self) -> dict:
473
- """Pad parameters.
474
-
475
- Returns
476
- -------
477
- dict
478
- params = {
479
- 'regular_pad': [
480
- {'layer_name': '1_Top', 'shape': 'circle', 'offset_x': '0.1mm', 'offset_y': '0', 'rotation': '0',
481
- 'diameter': '0.5mm'}
482
- ],
483
- 'anti_pad': [
484
- {'layer_name': '1_Top', 'shape': 'circle', 'offset_x': '0', 'offset_y': '0', 'rotation': '0',
485
- 'diameter': '1mm'}
486
- ],
487
- 'thermal_pad': [
488
- {'layer_name': '1_Top', 'shape': 'round90', 'offset_x': '0', 'offset_y': '0', 'rotation': '0',
489
- 'inner': '1mm', 'channel_width': '0.2mm', 'isolation_gap': '0.3mm'},
490
- ],
491
- 'hole': [
492
- {'layer_name': '1_Top', 'shape': 'circle', 'offset_x': '0', 'offset_y': '0', 'rotation': '0',
493
- 'diameter': '0.1499997mm'},
494
- ]
495
- }
496
- """
497
- pdef_data = self._padstack_def_data
498
- pad_type_list = [
499
- self._ppadstack._pedb._edb.Definition.PadType.RegularPad,
500
- self._ppadstack._pedb._edb.Definition.PadType.AntiPad,
501
- self._ppadstack._pedb._edb.Definition.PadType.ThermalPad,
502
- # self._ppadstack._pedb._edb.Definition.PadType.Hole,
503
- # This property doesn't appear in UI. It is unclear what it is used for. Suppressing this property for now.
504
- ]
505
- data = {}
506
- for pad_type in pad_type_list:
507
- pad_type_name = pascal_to_snake(pad_type.ToString())
508
- temp_list = []
509
- for lyr_name in list(pdef_data.GetLayerNames()):
510
- result = pdef_data.GetPadParametersValue(lyr_name, pad_type)
511
- _, pad_shape, params, offset_x, offset_y, rotation = result
512
- pad_shape = pascal_to_snake(pad_shape.ToString())
513
-
514
- pad_params = {}
515
- pad_params["layer_name"] = lyr_name
516
- pad_params["shape"] = pad_shape
517
- pad_params["offset_x"] = offset_x.ToString()
518
- pad_params["offset_y"] = offset_y.ToString()
519
- pad_params["rotation"] = rotation.ToString()
520
-
521
- for idx, i in enumerate(self.PAD_SHAPE_PARAMETERS[pad_shape]):
522
- pad_params[i] = params[idx].ToString()
523
- temp_list.append(pad_params)
524
- data[pad_type_name] = temp_list
525
- return data
526
-
527
- @pad_parameters.setter
528
- def pad_parameters(self, params: dict):
529
- original_params = self.pad_parameters
530
- pdef_data = self._padstack_def_data
531
-
532
- pad_type_list = [
533
- self._ppadstack._pedb._edb.Definition.PadType.RegularPad,
534
- self._ppadstack._pedb._edb.Definition.PadType.AntiPad,
535
- self._ppadstack._pedb._edb.Definition.PadType.ThermalPad,
536
- self._ppadstack._pedb._edb.Definition.PadType.Hole,
537
- ]
538
- for pad_type in pad_type_list:
539
- pad_type_name = pascal_to_snake(pad_type.ToString())
540
- rpp = params.get(pad_type_name, [])
541
- for idx, layer_data in enumerate(rpp):
542
- # Get geometry type from kwargs
543
- p = layer_data.get("shape")
544
- temp_param = []
545
-
546
- # Handle Circle geometry type
547
- if p == pascal_to_snake(self._ppadstack._pedb._edb.Definition.PadGeometryType.Circle.ToString()):
548
- temp_param.append(layer_data["diameter"])
549
- pad_shape = self._ppadstack._pedb._edb.Definition.PadGeometryType.Circle
550
-
551
- # Handle Square geometry type
552
- elif p == pascal_to_snake(self._ppadstack._pedb._edb.Definition.PadGeometryType.Square.ToString()):
553
- temp_param.append(layer_data["size"])
554
- pad_shape = self._ppadstack._pedb._edb.Definition.PadGeometryType.Square
555
-
556
- elif p == pascal_to_snake(self._ppadstack._pedb._edb.Definition.PadGeometryType.Rectangle.ToString()):
557
- temp_param.append(layer_data["x_size"])
558
- temp_param.append(layer_data["y_size"])
559
- pad_shape = self._ppadstack._pedb._edb.Definition.PadGeometryType.Rectangle
560
-
561
- # Handle Oval geometry type
562
- elif p == pascal_to_snake(self._ppadstack._pedb._edb.Definition.PadGeometryType.Oval.ToString()):
563
- temp_param.append(layer_data["x_size"])
564
- temp_param.append(layer_data["y_size"])
565
- temp_param.append(layer_data["corner_radius"])
566
- pad_shape = self._ppadstack._pedb._edb.Definition.PadGeometryType.Oval
567
-
568
- # Handle Bullet geometry type
569
- elif p == pascal_to_snake(self._ppadstack._pedb._edb.Definition.PadGeometryType.Bullet.ToString()):
570
- temp_param.append(layer_data["x_size"])
571
- temp_param.append(layer_data["y_size"])
572
- temp_param.append(layer_data["corner_radius"])
573
- pad_shape = self._ppadstack._pedb._edb.Definition.PadGeometryType.Bullet
574
-
575
- # Handle Round45 geometry type
576
- elif p == pascal_to_snake(self._ppadstack._pedb._edb.Definition.PadGeometryType.Round45.ToString()):
577
- temp_param.append(layer_data["inner"])
578
- temp_param.append(layer_data["channel_width"])
579
- temp_param.append(layer_data["isolation_gap"])
580
- pad_shape = self._ppadstack._pedb._edb.Definition.PadGeometryType.Round45
581
-
582
- # Handle Round90 geometry type
583
- elif p == pascal_to_snake(self._ppadstack._pedb._edb.Definition.PadGeometryType.Round90.ToString()):
584
- temp_param.append(layer_data["inner"])
585
- temp_param.append(layer_data["channel_width"])
586
- temp_param.append(layer_data["isolation_gap"])
587
- pad_shape = self._ppadstack._pedb._edb.Definition.PadGeometryType.Round90
588
- elif p == pascal_to_snake(self._ppadstack._pedb._edb.Definition.PadGeometryType.NoGeometry.ToString()):
589
- continue
590
-
591
- # Set pad parameters for the current layer
592
- pdef_data.SetPadParameters(
593
- layer_data["layer_name"],
594
- pad_type,
595
- pad_shape,
596
- convert_py_list_to_net_list([self._ppadstack._pedb.edb_value(i) for i in temp_param]),
597
- self._ppadstack._pedb.edb_value(layer_data.get("offset_x", 0)),
598
- self._ppadstack._pedb.edb_value(layer_data.get("offset_y", 0)),
599
- self._ppadstack._pedb.edb_value(layer_data.get("rotation", 0)),
600
- )
601
- self._padstack_def_data = pdef_data
602
-
603
- @property
604
- def hole_parameters(self):
605
- pdef_data = self._padstack_def_data
606
- _, hole_shape, params, offset_x, offset_y, rotation = pdef_data.GetHoleParametersValue()
607
- hole_shape = pascal_to_snake(hole_shape.ToString())
608
-
609
- hole_params = {}
610
- hole_params["shape"] = hole_shape
611
- for idx, i in enumerate(self.PAD_SHAPE_PARAMETERS[hole_shape]):
612
- hole_params[i] = params[idx].ToString()
613
- hole_params["offset_x"] = offset_x.ToString()
614
- hole_params["offset_y"] = offset_y.ToString()
615
- hole_params["rotation"] = rotation.ToString()
616
- return hole_params
617
-
618
- @hole_parameters.setter
619
- def hole_parameters(self, params: dict):
620
- original_params = self.hole_parameters
621
- pdef_data = self._padstack_def_data
622
-
623
- temp_param = []
624
- shape = params["shape"]
625
- if shape == "no_geometry":
626
- return # .net api doesn't tell how to set no_geometry shape.
627
- for idx, i in enumerate(self.PAD_SHAPE_PARAMETERS[shape]):
628
- temp_param.append(params[i])
629
- pedb_shape = getattr(self._ppadstack._pedb._edb.Definition.PadGeometryType, snake_to_pascal(shape))
630
-
631
- pdef_data.SetHoleParameters(
632
- pedb_shape,
633
- convert_py_list_to_net_list([self._ppadstack._pedb.edb_value(i) for i in temp_param]),
634
- self._ppadstack._pedb.edb_value(params.get("offset_x", original_params.get("offset_x", 0))),
635
- self._ppadstack._pedb.edb_value(params.get("offset_y", original_params.get("offset_y", 0))),
636
- self._ppadstack._pedb.edb_value(params.get("rotation", original_params.get("rotation", 0))),
637
- )
638
- self._padstack_def_data = pdef_data
639
-
640
460
  @property
641
461
  def instances(self):
642
462
  """Definitions Instances."""
@@ -1322,18 +1142,6 @@ class EDBPadstack(object):
1322
1142
  self.edb_padstack.SetData(new_padstack_data)
1323
1143
  return True
1324
1144
 
1325
- def set_properties(self, **kwargs):
1326
- for k in ["hole_plating_thickness", "material", "hole_range", "pad_parameters", "hole_parameters"]:
1327
- value = kwargs.get(k, False)
1328
- if value:
1329
- setattr(self, k, value)
1330
-
1331
- def get_properties(self):
1332
- kwargs = {}
1333
- for k in ["hole_plating_thickness", "material", "hole_range", "pad_parameters", "hole_parameters"]:
1334
- kwargs[k] = getattr(self, k)
1335
- return kwargs
1336
-
1337
1145
 
1338
1146
  class EDBPadstackInstance(Primitive):
1339
1147
  """Manages EDB functionalities for a padstack.
@@ -1583,6 +1391,17 @@ class EDBPadstackInstance(Primitive):
1583
1391
 
1584
1392
  @property
1585
1393
  def padstack_definition(self):
1394
+ """Padstack definition Name.
1395
+
1396
+ Returns
1397
+ -------
1398
+ str
1399
+ Name of the padstack definition.
1400
+ """
1401
+ return self.definition.name
1402
+
1403
+ @property
1404
+ def definition(self):
1586
1405
  """Padstack definition.
1587
1406
 
1588
1407
  Returns
@@ -1590,7 +1409,7 @@ class EDBPadstackInstance(Primitive):
1590
1409
  str
1591
1410
  Name of the padstack definition.
1592
1411
  """
1593
- self._pdef = self._edb_padstackinstance.GetPadstackDef().GetName()
1412
+ self._pdef = EDBPadstack(self._edb_padstackinstance.GetPadstackDef(), self._pedb.padstacks)
1594
1413
  return self._pdef
1595
1414
 
1596
1415
  @property
@@ -1975,6 +1794,10 @@ class EDBPadstackInstance(Primitive):
1975
1794
  name = str(name).strip("'")
1976
1795
  return name
1977
1796
 
1797
+ @aedt_name.setter
1798
+ def aedt_name(self, value):
1799
+ self._edb_object.SetProductProperty(self._pedb.edb_api.ProductId.Designer, 11, value)
1800
+
1978
1801
  def parametrize_position(self, prefix=None):
1979
1802
  """Parametrize the instance position.
1980
1803
 
@@ -2324,32 +2147,3 @@ class EDBPadstackInstance(Primitive):
2324
2147
  max_limit=max_limit,
2325
2148
  component_only=component_only,
2326
2149
  )
2327
-
2328
- @property
2329
- def properties(self):
2330
- data = {}
2331
- data["name"] = self.aedt_name
2332
- data["definition"] = self.padstack_definition
2333
- data["backdrill_parameters"] = self.backdrill_parameters
2334
- _, position, rotation = self._edb_object.GetPositionAndRotationValue()
2335
- data["position"] = [position.X.ToString(), position.Y.ToString()]
2336
- data["rotation"] = [rotation.ToString()]
2337
- data["id"] = self.id
2338
- hole_override_enabled, hole_override_diam = self._edb_object.GetHoleOverrideValue()
2339
- data["hole_override_enabled"] = hole_override_enabled
2340
- data["hole_override_diameter"] = hole_override_diam.ToString()
2341
- return data
2342
-
2343
- @properties.setter
2344
- def properties(self, params):
2345
- name = params.get("name", None)
2346
- if name:
2347
- self.aedt_name = name
2348
- backdrill_parameters = params.get("backdrill_parameters", None)
2349
- if backdrill_parameters:
2350
- self.backdrill_parameters = backdrill_parameters
2351
- h_o_enabled = params.get("hole_override_enabled", None)
2352
- h_o_enabled = h_o_enabled if h_o_enabled else self.properties["hole_override_enabled"]
2353
- h_o_diameter = params.get("hole_override_diameter")
2354
- h_o_diameter = h_o_diameter if h_o_diameter else self.properties["hole_override_diameter"]
2355
- self._edb_object.SetHoleOverride(h_o_enabled, self._pedb.edb_value(h_o_diameter))
@@ -29,6 +29,7 @@ from pyedb.dotnet.edb_core.dotnet.primitive import (
29
29
  RectangleDotNet,
30
30
  TextDotNet,
31
31
  )
32
+ from pyedb.dotnet.edb_core.geometry.polygon_data import PolygonData
32
33
  from pyedb.modeler.geometry_operators import GeometryOperators
33
34
 
34
35
 
@@ -305,6 +306,36 @@ class EdbPolygon(Primitive):
305
306
  # prim = point_list
306
307
  # return self.add_void(prim)
307
308
 
309
+ @property
310
+ def polygon_data(self):
311
+ """:class:`pyedb.dotnet.edb_core.dotnet.database.PolygonDataDotNet`: Outer contour of the Polygon object."""
312
+ return PolygonData(self._pedb, self._edb_object.GetPolygonData())
313
+
314
+ @polygon_data.setter
315
+ def polygon_data(self, poly):
316
+ self._edb_object.SetPolygonData(poly._edb_object)
317
+
318
+ def expand(self, offset=0.001, tolerance=1e-12, round_corners=True, maximum_corner_extension=0.001):
319
+ """Expand the polygon shape by an absolute value in all direction.
320
+ Offset can be negative for negative expansion.
321
+
322
+ Parameters
323
+ ----------
324
+ offset : float, optional
325
+ Offset value in meters.
326
+ tolerance : float, optional
327
+ Tolerance in meters.
328
+ round_corners : bool, optional
329
+ Whether to round corners or not.
330
+ If True, use rounded corners in the expansion otherwise use straight edges (can be degenerate).
331
+ maximum_corner_extension : float, optional
332
+ The maximum corner extension (when round corners are not used) at which point the corner is clipped.
333
+ """
334
+ pd = self.polygon_data
335
+ pd.expand(offset, tolerance, round_corners, maximum_corner_extension)
336
+ self.polygon_data = pd
337
+ return pd
338
+
308
339
 
309
340
  class EdbText(Primitive, TextDotNet):
310
341
  def __init__(self, raw_primitive, core_app):
@@ -1168,8 +1168,8 @@ class EdbHfss(object):
1168
1168
  list
1169
1169
  [lower left corner X, lower left corner, upper right corner X, upper right corner Y].
1170
1170
  """
1171
- if layout == None:
1172
- return False
1171
+ if layout is None:
1172
+ layout = self._active_layout
1173
1173
  layout_obj_instances = layout.GetLayoutInstance().GetAllLayoutObjInstances()
1174
1174
  tuple_list = []
1175
1175
  for lobj in layout_obj_instances.Items:
@@ -332,9 +332,7 @@ class LayoutValidation:
332
332
  counts += 1
333
333
  if fix:
334
334
  if not obj.component:
335
- obj._edb_object.SetProductProperty(
336
- self._pedb.edb_api.ProductId.Designer, 11, f"via_{via_count}"
337
- )
335
+ obj._edb_object.SetProductProperty(self._pedb.edb_api.ProductId.Designer, 11, f"Via{via_count}")
338
336
  via_count = via_count + 1
339
337
  else:
340
338
  obj._edb_object.SetProductProperty(