@@ -1901,8 +1901,9 @@ def export_to_hfss(self, output_file, keep_net_name=False):
1901
1901
@pyaedt_function_handler ()
1902
1902
def _get_net_names (self , app , file_fullname ):
1903
1903
primitives_3d_pts_per_nets = self ._get_primitives_points_per_net ()
1904
+ self .p_app .logger .info ("Processing vias..." )
1904
1905
via_per_nets = self ._get_via_position_per_net ()
1905
- pass
1906
+ self . p_app . logger . info ( "Vias processing completed." )
1906
1907
layers_elevation = {
1907
1908
lay .name : lay .lower_elevation + lay .thickness / 2
1908
1909
for lay in list (self .p_app .modeler .edb .stackup .signal_layers .values ())
@@ -1918,49 +1919,49 @@ def _get_net_names(self, app, file_fullname):
1918
1919
for obj in aedtapp .modeler .solid_objects
1919
1920
if not obj .material_name in aedtapp .modeler .materials .dielectrics
1920
1921
]
1921
- for net , primitives in primitives_3d_pts_per_nets .items ():
1922
- obj_dict = {}
1923
- for position in primitives_3d_pts_per_nets [ net ] :
1922
+ for net , positions in primitives_3d_pts_per_nets .items ():
1923
+ object_names = []
1924
+ for position in positions :
1924
1925
aedtapp_objs = [p for p in aedtapp .modeler .get_bodynames_from_position (position ) if p in metal_object ]
1925
- if aedtapp_objs :
1926
- for p in aedtapp .modeler .get_bodynames_from_position (position , None , False ):
1927
- if p in metal_object :
1928
- obj_ind = aedtapp .modeler .objects [p ].id
1929
- if obj_ind not in obj_dict :
1930
- obj_dict [obj_ind ] = aedtapp .modeler .objects [obj_ind ]
1926
+ object_names .extend (aedtapp_objs )
1931
1927
if net in via_per_nets :
1932
1928
for via_pos in via_per_nets [net ]:
1933
- for p in aedtapp .modeler .get_bodynames_from_position (via_pos , None , False ):
1934
- if p in metal_object :
1935
- obj_ind = aedtapp .modeler .objects [p ].id
1936
- if obj_ind not in obj_dict :
1937
- obj_dict [obj_ind ] = aedtapp .modeler .objects [obj_ind ]
1938
- for lay_el in list (layers_elevation .values ()):
1939
- pad_pos = via_pos [:2 ]
1940
- pad_pos .append (lay_el )
1941
- pad_objs = aedtapp .modeler .get_bodynames_from_position (pad_pos , None , False )
1942
- for pad_obj in pad_objs :
1943
- if pad_obj in metal_object :
1944
- pad_ind = aedtapp .modeler .objects [pad_obj ].id
1945
- if pad_ind not in obj_dict :
1946
- obj_dict [pad_ind ] = aedtapp .modeler .objects [pad_ind ]
1947
- obj_list = list (obj_dict .values ())
1929
+ object_names .extend (
1930
+ [
1931
+ p
1932
+ for p in aedtapp .modeler .get_bodynames_from_position (via_pos , None , False )
1933
+ if p in metal_object
1934
+ ]
1935
+ )
1936
+
1937
+ for lay_el in list (layers_elevation .values ()):
1938
+ pad_pos = via_pos [:2 ]
1939
+ pad_pos .append (lay_el )
1940
+ object_names .extend (
1941
+ [
1942
+ p
1943
+ for p in aedtapp .modeler .get_bodynames_from_position (pad_pos , None , False )
1944
+ if p in metal_object
1945
+ ]
1946
+ )
1947
+
1948
1948
net = net .replace ("." , "_" )
1949
- if len (obj_list ) == 1 :
1950
- net = net .replace ("-" , "m" )
1951
- net = net .replace ("+" , "p" )
1952
- net_name = re .sub ("[^a-zA-Z0-9 .\n ]" , "_" , net )
1953
- obj_list [0 ].name = net_name
1954
- obj_list [0 ].color = [randrange (255 ), randrange (255 ), randrange (255 )]
1955
- elif len (obj_list ) > 1 :
1956
- united_object = aedtapp .modeler .unite (obj_list , purge = True )
1949
+ net = net .replace ("-" , "m" )
1950
+ net = net .replace ("+" , "p" )
1951
+ net_name = re .sub ("[^a-zA-Z0-9 .\n ]" , "_" , net )
1952
+ self .p_app .logger .info ("Renaming primitives for net {}..." .format (net_name ))
1953
+ object_names = list (set (object_names ))
1954
+ if len (object_names ) == 1 :
1955
+
1956
+ object_p = aedtapp .modeler [object_names [0 ]]
1957
+ object_p .name = net_name
1958
+ object_p .color = [randrange (255 ), randrange (255 ), randrange (255 )] # nosec
1959
+ elif len (object_names ) > 1 :
1960
+ united_object = aedtapp .modeler .unite (object_names , purge = True )
1957
1961
obj_ind = aedtapp .modeler .objects [united_object ].id
1958
1962
if obj_ind :
1959
- net = net .replace ("-" , "m" )
1960
- net = net .replace ("+" , "p" )
1961
- net_name = re .sub ("[^a-zA-Z0-9 .\n ]" , "_" , net )
1962
1963
aedtapp .modeler .objects [obj_ind ].name = net_name
1963
- aedtapp .modeler .objects [obj_ind ].color = [randrange (255 ), randrange (255 ), randrange (255 )]
1964
+ aedtapp .modeler .objects [obj_ind ].color = [randrange (255 ), randrange (255 ), randrange (255 )] # nosec
1964
1965
1965
1966
if aedtapp .design_type == "Q3D Extractor" :
1966
1967
aedtapp .auto_identify_nets ()
@@ -1973,21 +1974,61 @@ def _get_primitives_points_per_net(self):
1973
1974
return
1974
1975
net_primitives = edb .modeler .primitives_by_net
1975
1976
primitive_dict = {}
1977
+ layers_elevation = {
1978
+ lay .name : lay .lower_elevation + lay .thickness / 2
1979
+ for lay in list (self .p_app .modeler .edb .stackup .signal_layers .values ())
1980
+ }
1976
1981
for net , primitives in net_primitives .items ():
1977
1982
primitive_dict [net ] = []
1978
- n = 0
1979
- while len (primitive_dict [net ]) < len (net_primitives [net ]):
1980
- if n > 1000 : # adding 1000 as maximum value to prevent infinite loop
1981
- return
1982
- n += 20
1983
- primitive_dict [net ] = []
1984
- for prim in primitives :
1985
- layer = edb .stackup .signal_layers [prim .layer_name ]
1986
- z = layer .lower_elevation + layer .thickness / 2
1987
- pt = self ._get_point_inside_primitive (prim , n )
1988
- if pt :
1989
- pt .append (z )
1990
- primitive_dict [net ].append (pt )
1983
+ self .p_app .logger .info ("Processing net {}..." .format (net ))
1984
+ for prim in primitives :
1985
+
1986
+ if prim .layer_name not in layers_elevation :
1987
+ continue
1988
+ z = layers_elevation [prim .layer_name ]
1989
+ if "EdbPath" in str (prim ):
1990
+ points = list (prim .center_line .Points )
1991
+ pt = [points [0 ].X .ToDouble (), points [0 ].Y .ToDouble ()]
1992
+ pt .append (z )
1993
+ next_p = int (len (points ) / 4 )
1994
+ pt = [points [next_p ].X .ToDouble (), points [next_p ].Y .ToDouble ()]
1995
+ pt .append (z )
1996
+ primitive_dict [net ].append (pt )
1997
+
1998
+ elif "EdbPolygon" in str (prim ):
1999
+ pdata_orig = prim .polygon_data .edb_api
2000
+ pdata = self .p_app .modeler .edb ._edb .Geometry .PolygonData .CreateFromArcs (
2001
+ pdata_orig .GetArcData (), True
2002
+ )
2003
+
2004
+ pdata .Scale (0.99 , pdata .GetBoundingCircleCenter ())
2005
+ points = [[], []]
2006
+ for point in list (pdata .Points ):
2007
+ points [0 ].append (point .X .ToDouble ())
2008
+ points [1 ].append (point .Y .ToDouble ())
2009
+ # points = prim.points()
2010
+ pt = [points [0 ][0 ], points [1 ][0 ]]
2011
+ pt .append (z )
2012
+ primitive_dict [net ].append (pt )
2013
+ next_p = int (len (points [0 ]) / 4 )
2014
+ pt = [points [0 ][next_p ], points [1 ][next_p ]]
2015
+ pt .append (z )
2016
+ primitive_dict [net ].append (pt )
2017
+ next_p = int (len (points [0 ]) / 2 )
2018
+ pt = [points [0 ][next_p ], points [1 ][next_p ]]
2019
+ pt .append (z )
2020
+ primitive_dict [net ].append (pt )
2021
+
2022
+ else :
2023
+ n = 0
2024
+ while n < 1000 :
2025
+ n += 10
2026
+ pt = self ._get_point_inside_primitive (prim , n )
2027
+ if pt :
2028
+ pt .append (z )
2029
+ primitive_dict [net ].append (pt )
2030
+ break
2031
+ self .p_app .logger .info ("Net processing completed." )
1991
2032
return primitive_dict
1992
2033
1993
2034
@pyaedt_function_handler ()
@@ -2014,14 +2055,6 @@ def _get_point_inside_primitive(self, primitive, n):
2014
2055
if GeometryOperators .point_in_polygon ([x , y ], [primitive_x_points , primitive_y_points ]) == 1 :
2015
2056
return [x , y ]
2016
2057
2017
- @pyaedt_function_handler ()
2018
- def _get_polygon_centroid (self , arcs = None ):
2019
- if arcs :
2020
- k = len (arcs [0 ])
2021
- x = sum (arcs [0 ]) / k
2022
- y = sum (arcs [1 ]) / k
2023
- return [x , y ]
2024
-
2025
2058
@pyaedt_function_handler ()
2026
2059
def _convert_edb_to_aedt_units (self , input_dict = None , output_unit = 0.001 ):
2027
2060
if input_dict :
0 commit comments