|
@@ -18,9 +18,8 @@ import time
|
|
|
|
|
|
|
|
nombre_archivo = "resultados1.txt"
|
|
nombre_archivo = "resultados1.txt"
|
|
|
|
|
|
|
|
-f = open(nombre_archivo, "w")
|
|
|
|
|
-f.write("H\tb\ttf\ttw\tFrecuencia\tCoef_Impacto\tFlecha_38D\tFlecha_86E\tFlecha_Media\tArea\tIxg\tIyg\tImax\tImin\tPeso\n")
|
|
|
|
|
-f.close() # Limpiar el archivo al inicio
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
|
|
|
class TimeoutException(Exception):
|
|
class TimeoutException(Exception):
|
|
|
pass
|
|
pass
|
|
@@ -66,7 +65,11 @@ class SAPSectionDesignerGUI:
|
|
|
|
|
|
|
|
frame_datos = tk.Frame(self.root)
|
|
frame_datos = tk.Frame(self.root)
|
|
|
frame_datos.pack(pady=5, padx=20, fill="x")
|
|
frame_datos.pack(pady=5, padx=20, fill="x")
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ con_ref = tk.BooleanVar(value=False)
|
|
|
|
|
+ chk_con_ref = ttk.Checkbutton(frame_datos, text="Con Refuerzos verticales", variable=con_ref)
|
|
|
|
|
+ chk_con_ref.pack(anchor="w")
|
|
|
|
|
+ self.con_ref = con_ref
|
|
|
# Frame para parámetros fijos
|
|
# Frame para parámetros fijos
|
|
|
frame_fixed = ttk.LabelFrame(self.root, text="Parámetros Fijos", padding=5)
|
|
frame_fixed = ttk.LabelFrame(self.root, text="Parámetros Fijos", padding=5)
|
|
|
frame_fixed.pack(fill=tk.X, pady=(0, 10))
|
|
frame_fixed.pack(fill=tk.X, pady=(0, 10))
|
|
@@ -76,7 +79,7 @@ class SAPSectionDesignerGUI:
|
|
|
self.sweep_fixed_entries = {}
|
|
self.sweep_fixed_entries = {}
|
|
|
self.sweep_range_entries = {}
|
|
self.sweep_range_entries = {}
|
|
|
|
|
|
|
|
- params_ipe = ['H', 'b', 'tf', 'tw']
|
|
|
|
|
|
|
+ params_ipe = ['H', 'b', 'tf', 'tw', 'e_ref', 'L_ref']
|
|
|
for param in params_ipe:
|
|
for param in params_ipe:
|
|
|
container = ttk.Frame(frame_fixed)
|
|
container = ttk.Frame(frame_fixed)
|
|
|
container.pack(pady=2)
|
|
container.pack(pady=2)
|
|
@@ -96,6 +99,8 @@ class SAPSectionDesignerGUI:
|
|
|
self.sweep_fixed_entries['b'].set("0.45")
|
|
self.sweep_fixed_entries['b'].set("0.45")
|
|
|
self.sweep_fixed_entries['tf'].set("0.01")
|
|
self.sweep_fixed_entries['tf'].set("0.01")
|
|
|
self.sweep_fixed_entries['tw'].set("0.01")
|
|
self.sweep_fixed_entries['tw'].set("0.01")
|
|
|
|
|
+ self.sweep_fixed_entries['e_ref'].set("0.01")
|
|
|
|
|
+ self.sweep_fixed_entries['L_ref'].set("0.01")
|
|
|
|
|
|
|
|
# Frame para parámetros a barrer
|
|
# Frame para parámetros a barrer
|
|
|
frame_sweep = ttk.LabelFrame(self.root, text="Parámetros a Barrer", padding=5)
|
|
frame_sweep = ttk.LabelFrame(self.root, text="Parámetros a Barrer", padding=5)
|
|
@@ -160,7 +165,7 @@ class SAPSectionDesignerGUI:
|
|
|
fixed_params = {}
|
|
fixed_params = {}
|
|
|
sweep_configs = {}
|
|
sweep_configs = {}
|
|
|
|
|
|
|
|
- for param in ['H', 'b', 'tf', 'tw']:
|
|
|
|
|
|
|
+ for param in ['H', 'b', 'tf', 'tw', 'e_ref', 'L_ref'] if self.con_ref.get() else ['H', 'b', 'tf', 'tw']:
|
|
|
is_fixed = self.sweep_toggle_vars[param].get()
|
|
is_fixed = self.sweep_toggle_vars[param].get()
|
|
|
|
|
|
|
|
if is_fixed:
|
|
if is_fixed:
|
|
@@ -205,16 +210,30 @@ class SAPSectionDesignerGUI:
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
results = []
|
|
results = []
|
|
|
|
|
+
|
|
|
|
|
+ f = open(nombre_archivo, "w")
|
|
|
|
|
+ if self.con_ref.get():
|
|
|
|
|
+ f.write("H\tb\ttf\ttw\te\tL\tFrecuencia\tCoef_Impacto\tFlecha_38D\tFlecha_86E\tFlecha_Media\tArea\tIxg\tIyg\tImax\tImin\tPeso\n")
|
|
|
|
|
+ else:
|
|
|
|
|
+ f.write("H\tb\ttf\ttw\tFrecuencia\tCoef_Impacto\tFlecha_38D\tFlecha_86E\tFlecha_Media\tArea\tIxg\tIyg\tImax\tImin\tPeso\n")
|
|
|
|
|
|
|
|
for params in combinations:
|
|
for params in combinations:
|
|
|
SapModel.SetModelisLocked(False)
|
|
SapModel.SetModelisLocked(False)
|
|
|
SapModel.SetPresentUnits(10) #unidades en niutons metros
|
|
SapModel.SetPresentUnits(10) #unidades en niutons metros
|
|
|
- points_ipe = self.generate_ipe_points(params['H'], params['b'], params['tf'], params['tw'])
|
|
|
|
|
- properties_ipe = self.calculate_section_properties(points_ipe)
|
|
|
|
|
- points_hueco_inf = self.generate_hueco_inf_points(params['H'], params['b'], params['tf'], params['tw'])
|
|
|
|
|
- points_hueco_sup = self.generate_hueco_sup_points(params['H'], params['b'], params['tf'], params['tw'])
|
|
|
|
|
- points_completo = self.generate_completo_points(params['H'], params['b'], params['tf'], params['tw'])
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if self.con_ref.get():
|
|
|
|
|
+ points_ipe = self.generate_ipe_points_ref(params['H'], params['b'], params['tf'], params['tw'], params['e_ref'], params['L_ref'])
|
|
|
|
|
+ points_hueco_inf = self.generate_hueco_inf_points_ref(params['H'], params['b'], params['tf'], params['tw'], params['e_ref'], params['L_ref'])
|
|
|
|
|
+ points_hueco_sup = self.generate_hueco_sup_points_ref(params['H'], params['b'], params['tf'], params['tw'], params['e_ref'], params['L_ref'])
|
|
|
|
|
+ points_completo = self.generate_completo_points_ref(params['H'], params['b'], params['tf'], params['tw'], params['e_ref'], params['L_ref'])
|
|
|
|
|
+ else:
|
|
|
|
|
+ points_ipe = self.generate_ipe_points(params['H'], params['b'], params['tf'], params['tw'])
|
|
|
|
|
+ points_hueco_inf = self.generate_hueco_inf_points(params['H'], params['b'], params['tf'], params['tw'])
|
|
|
|
|
+ points_hueco_sup = self.generate_hueco_sup_points(params['H'], params['b'], params['tf'], params['tw'])
|
|
|
|
|
+ points_completo = self.generate_completo_points(params['H'], params['b'], params['tf'], params['tw'])
|
|
|
|
|
|
|
|
|
|
+ properties_ipe = self.calculate_section_properties(points_ipe)
|
|
|
|
|
+
|
|
|
self.crear_seccion(points_ipe, tipo="ipe", nombre_poligono = "Polygon1")
|
|
self.crear_seccion(points_ipe, tipo="ipe", nombre_poligono = "Polygon1")
|
|
|
self.crear_seccion(points_hueco_inf, tipo="hueco", nombre_poligono = "Polygon1")
|
|
self.crear_seccion(points_hueco_inf, tipo="hueco", nombre_poligono = "Polygon1")
|
|
|
self.crear_seccion(points_hueco_sup, tipo="hueco", nombre_poligono = "Polygon2")
|
|
self.crear_seccion(points_hueco_sup, tipo="hueco", nombre_poligono = "Polygon2")
|
|
@@ -239,7 +258,7 @@ class SAPSectionDesignerGUI:
|
|
|
|
|
|
|
|
SapModel.SetPresentUnits(9) # Unidades niutons milimetos
|
|
SapModel.SetPresentUnits(9) # Unidades niutons milimetos
|
|
|
ret = SapModel.Results.Setup.DeselectAllCasesAndCombosForOutput()
|
|
ret = SapModel.Results.Setup.DeselectAllCasesAndCombosForOutput()
|
|
|
- ret = SapModel.Results.Setup.SetComboSelectedForOutput("1. ENV ELS FREQ")
|
|
|
|
|
|
|
+ ret = SapModel.Results.Setup.SetComboSelectedForOutput("3. ENV ELS CAR")
|
|
|
|
|
|
|
|
FieldKeyList = []
|
|
FieldKeyList = []
|
|
|
GroupName = 'All'
|
|
GroupName = 'All'
|
|
@@ -279,21 +298,40 @@ class SAPSectionDesignerGUI:
|
|
|
|
|
|
|
|
|
|
|
|
|
f = open(nombre_archivo, "a")
|
|
f = open(nombre_archivo, "a")
|
|
|
- string = (f"{params['H'].item() if isinstance(params['H'], np.ndarray) else params['H']}\
|
|
|
|
|
- {params['b'].item() if isinstance(params['b'], np.ndarray) else params['b']}\
|
|
|
|
|
- {params['tf'].item() if isinstance(params['tf'], np.ndarray) else params['tf']}\
|
|
|
|
|
- {params['tw'].item() if isinstance(params['tw'], np.ndarray) else params['tw']}\
|
|
|
|
|
- {frequency}\
|
|
|
|
|
- {coef_impacto}\
|
|
|
|
|
- {flecha1}\
|
|
|
|
|
- {flecha2}\
|
|
|
|
|
- {flecha_media}\
|
|
|
|
|
- {properties_ipe['area'].item()}\
|
|
|
|
|
- {properties_ipe['ixg'].item()}\
|
|
|
|
|
- {properties_ipe['iyg'].item()}\
|
|
|
|
|
- {properties_ipe['imax'].item()}\
|
|
|
|
|
- {properties_ipe['imin'].item()}\
|
|
|
|
|
- {properties_ipe['peso'].item()}\n").replace(".", ",")
|
|
|
|
|
|
|
+ if self.con_ref.get():
|
|
|
|
|
+ string = (f"{params['H'].item() if isinstance(params['H'], np.ndarray) else params['H']}\
|
|
|
|
|
+ {params['b'].item() if isinstance(params['b'], np.ndarray) else params['b']}\
|
|
|
|
|
+ {params['tf'].item() if isinstance(params['tf'], np.ndarray) else params['tf']}\
|
|
|
|
|
+ {params['tw'].item() if isinstance(params['tw'], np.ndarray) else params['tw']}\
|
|
|
|
|
+ {params['e_ref'].item() if isinstance(params['e_ref'], np.ndarray) else params['e_ref']}\
|
|
|
|
|
+ {params['L_ref'].item() if isinstance(params['L_ref'], np.ndarray) else params['L_ref']}\
|
|
|
|
|
+ {frequency}\
|
|
|
|
|
+ {coef_impacto}\
|
|
|
|
|
+ {flecha1}\
|
|
|
|
|
+ {flecha2}\
|
|
|
|
|
+ {flecha_media}\
|
|
|
|
|
+ {properties_ipe['area'].item()}\
|
|
|
|
|
+ {properties_ipe['ixg'].item()}\
|
|
|
|
|
+ {properties_ipe['iyg'].item()}\
|
|
|
|
|
+ {properties_ipe['imax'].item()}\
|
|
|
|
|
+ {properties_ipe['imin'].item()}\
|
|
|
|
|
+ {properties_ipe['peso'].item()}\n").replace(".", ",")
|
|
|
|
|
+ else:
|
|
|
|
|
+ string = (f"{params['H'].item() if isinstance(params['H'], np.ndarray) else params['H']}\
|
|
|
|
|
+ {params['b'].item() if isinstance(params['b'], np.ndarray) else params['b']}\
|
|
|
|
|
+ {params['tf'].item() if isinstance(params['tf'], np.ndarray) else params['tf']}\
|
|
|
|
|
+ {params['tw'].item() if isinstance(params['tw'], np.ndarray) else params['tw']}\
|
|
|
|
|
+ {frequency}\
|
|
|
|
|
+ {coef_impacto}\
|
|
|
|
|
+ {flecha1}\
|
|
|
|
|
+ {flecha2}\
|
|
|
|
|
+ {flecha_media}\
|
|
|
|
|
+ {properties_ipe['area'].item()}\
|
|
|
|
|
+ {properties_ipe['ixg'].item()}\
|
|
|
|
|
+ {properties_ipe['iyg'].item()}\
|
|
|
|
|
+ {properties_ipe['imax'].item()}\
|
|
|
|
|
+ {properties_ipe['imin'].item()}\
|
|
|
|
|
+ {properties_ipe['peso'].item()}\n").replace(".", ",")
|
|
|
f.write(string)
|
|
f.write(string)
|
|
|
f.close()
|
|
f.close()
|
|
|
|
|
|
|
@@ -324,7 +362,7 @@ class SAPSectionDesignerGUI:
|
|
|
|
|
|
|
|
L_phi = 15 # m
|
|
L_phi = 15 # m
|
|
|
v = 80 # km/h
|
|
v = 80 # km/h
|
|
|
- r = 0.5 # calidad de mantenimiento de la vía
|
|
|
|
|
|
|
+ r = 1 # calidad de mantenimiento de la vía
|
|
|
|
|
|
|
|
alpha = 1 if v/3.6 > 22 else v/(3.6*22)
|
|
alpha = 1 if v/3.6 > 22 else v/(3.6*22)
|
|
|
|
|
|
|
@@ -528,6 +566,38 @@ class SAPSectionDesignerGUI:
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
return points
|
|
return points
|
|
|
|
|
+
|
|
|
|
|
+ def generate_completo_points_ref(self, H, b, tf, tw, e_ref, L_ref):
|
|
|
|
|
+ """Genera los puntos de una sección IPE a partir de parámetros normalizados"""
|
|
|
|
|
+ h_alma = H - 2*tf
|
|
|
|
|
+ x_alma_ini = (b - .3) / 2
|
|
|
|
|
+ x_alma_fin = (b + .3) / 2
|
|
|
|
|
+ x = (0.169 - tf) * e_ref / (b - x_alma_fin) + tf
|
|
|
|
|
+
|
|
|
|
|
+ points = np.array([
|
|
|
|
|
+ [0, 0],
|
|
|
|
|
+ [b, 0],
|
|
|
|
|
+ [b, L_ref],
|
|
|
|
|
+ [b - e_ref, L_ref],
|
|
|
|
|
+ [b - e_ref, x],
|
|
|
|
|
+ [x_alma_fin, 0.169],
|
|
|
|
|
+ [x_alma_fin, H - .169],
|
|
|
|
|
+ [b - e_ref, H - x],
|
|
|
|
|
+ [b - e_ref, H - L_ref],
|
|
|
|
|
+ [b, H - L_ref],
|
|
|
|
|
+ [b, H],
|
|
|
|
|
+ [0, H],
|
|
|
|
|
+ [0, H - L_ref],
|
|
|
|
|
+ [e_ref, H - L_ref],
|
|
|
|
|
+ [e_ref, H - x],
|
|
|
|
|
+ [x_alma_ini, H - 0.169],
|
|
|
|
|
+ [x_alma_ini, 0.169],
|
|
|
|
|
+ [e_ref, x],
|
|
|
|
|
+ [e_ref, L_ref],
|
|
|
|
|
+ [0, L_ref],
|
|
|
|
|
+ ])
|
|
|
|
|
+
|
|
|
|
|
+ return points
|
|
|
|
|
|
|
|
|
|
|
|
|
def generate_hueco_inf_points(self, H, b, tf, tw):
|
|
def generate_hueco_inf_points(self, H, b, tf, tw):
|
|
@@ -541,14 +611,37 @@ class SAPSectionDesignerGUI:
|
|
|
[b, 0],
|
|
[b, 0],
|
|
|
[b, tf],
|
|
[b, tf],
|
|
|
[x_alma_fin, tf],
|
|
[x_alma_fin, tf],
|
|
|
- [x_alma_fin, H - tf -.36 - .169],
|
|
|
|
|
- [x_alma_ini, H - tf - .36 - .169],
|
|
|
|
|
|
|
+ [x_alma_fin, H -.36 - .169],
|
|
|
|
|
+ [x_alma_ini, H - .36 - .169],
|
|
|
[x_alma_ini, tf],
|
|
[x_alma_ini, tf],
|
|
|
[0, tf],
|
|
[0, tf],
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
return points
|
|
return points
|
|
|
|
|
|
|
|
|
|
+ def generate_hueco_inf_points_ref(self, H, b, tf, tw, e_ref, L_ref):
|
|
|
|
|
+ """Genera los puntos de una sección IPE a partir de parámetros normalizados"""
|
|
|
|
|
+ h_alma = H - 2*tf
|
|
|
|
|
+ x_alma_ini = (b - tw) / 2
|
|
|
|
|
+ x_alma_fin = (b + tw) / 2
|
|
|
|
|
+
|
|
|
|
|
+ points = np.array([
|
|
|
|
|
+ [0, 0],
|
|
|
|
|
+ [b, 0],
|
|
|
|
|
+ [b, L_ref],
|
|
|
|
|
+ [b - e_ref, L_ref],
|
|
|
|
|
+ [b - e_ref, tf],
|
|
|
|
|
+ [x_alma_fin, tf],
|
|
|
|
|
+ [x_alma_fin, H -.36 - .169],
|
|
|
|
|
+ [x_alma_ini, H - .36 - .169],
|
|
|
|
|
+ [x_alma_ini, tf],
|
|
|
|
|
+ [e_ref, tf],
|
|
|
|
|
+ [e_ref, L_ref],
|
|
|
|
|
+ [0, L_ref],
|
|
|
|
|
+ ])
|
|
|
|
|
+
|
|
|
|
|
+ return points
|
|
|
|
|
+
|
|
|
def generate_hueco_sup_points(self, H, b, tf, tw):
|
|
def generate_hueco_sup_points(self, H, b, tf, tw):
|
|
|
"""Genera los puntos de una sección IPE a partir de parámetros normalizados"""
|
|
"""Genera los puntos de una sección IPE a partir de parámetros normalizados"""
|
|
|
h_alma = H - 2*tf
|
|
h_alma = H - 2*tf
|
|
@@ -567,6 +660,29 @@ class SAPSectionDesignerGUI:
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
return points
|
|
return points
|
|
|
|
|
+
|
|
|
|
|
+ def generate_hueco_sup_points_ref(self, H, b, tf, tw, e_ref, L_ref):
|
|
|
|
|
+ """Genera los puntos de una sección IPE a partir de parámetros normalizados"""
|
|
|
|
|
+ h_alma = H - 2*tf
|
|
|
|
|
+ x_alma_ini = (b - tw) / 2
|
|
|
|
|
+ x_alma_fin = (b + tw) / 2
|
|
|
|
|
+
|
|
|
|
|
+ points = np.array([
|
|
|
|
|
+ [x_alma_fin, H - .169],
|
|
|
|
|
+ [x_alma_fin, H - tf],
|
|
|
|
|
+ [b - e_ref, H - tf],
|
|
|
|
|
+ [b - e_ref, H - L_ref],
|
|
|
|
|
+ [b, H - L_ref],
|
|
|
|
|
+ [b, H],
|
|
|
|
|
+ [0, H],
|
|
|
|
|
+ [0, H - L_ref],
|
|
|
|
|
+ [e_ref, H - L_ref],
|
|
|
|
|
+ [e_ref, H - tf],
|
|
|
|
|
+ [x_alma_ini, H - tf],
|
|
|
|
|
+ [x_alma_ini, H - .169],
|
|
|
|
|
+ ])
|
|
|
|
|
+
|
|
|
|
|
+ return points
|
|
|
|
|
|
|
|
def generate_ipe_points(self, H, b, tf, tw):
|
|
def generate_ipe_points(self, H, b, tf, tw):
|
|
|
"""Genera los puntos de una sección IPE a partir de parámetros normalizados"""
|
|
"""Genera los puntos de una sección IPE a partir de parámetros normalizados"""
|
|
@@ -591,6 +707,37 @@ class SAPSectionDesignerGUI:
|
|
|
|
|
|
|
|
return points
|
|
return points
|
|
|
|
|
|
|
|
|
|
+ def generate_ipe_points_ref(self, H, b, tf, tw, e_ref, L_ref):
|
|
|
|
|
+ """Genera los puntos de una sección IPE a partir de parámetros normalizados"""
|
|
|
|
|
+ h_alma = H - 2*tf
|
|
|
|
|
+ x_alma_ini = (b - tw) / 2
|
|
|
|
|
+ x_alma_fin = (b + tw) / 2
|
|
|
|
|
+
|
|
|
|
|
+ points = np.array([
|
|
|
|
|
+ [0, 0],
|
|
|
|
|
+ [b, 0],
|
|
|
|
|
+ [b, L_ref],
|
|
|
|
|
+ [b - e_ref, L_ref],
|
|
|
|
|
+ [b - e_ref, tf],
|
|
|
|
|
+ [x_alma_fin, tf],
|
|
|
|
|
+ [x_alma_fin, H - tf],
|
|
|
|
|
+ [b - e_ref, H - tf],
|
|
|
|
|
+ [b - e_ref, H - L_ref],
|
|
|
|
|
+ [b, H - L_ref],
|
|
|
|
|
+ [b, H],
|
|
|
|
|
+ [0, H],
|
|
|
|
|
+ [0, H - L_ref],
|
|
|
|
|
+ [e_ref, H - L_ref],
|
|
|
|
|
+ [e_ref, H - tf],
|
|
|
|
|
+ [x_alma_ini, H - tf],
|
|
|
|
|
+ [x_alma_ini, tf],
|
|
|
|
|
+ [e_ref, tf],
|
|
|
|
|
+ [e_ref, L_ref],
|
|
|
|
|
+ [0, L_ref],
|
|
|
|
|
+ ])
|
|
|
|
|
+
|
|
|
|
|
+ return points
|
|
|
|
|
+
|
|
|
def _valid_geometry(self, params):
|
|
def _valid_geometry(self, params):
|
|
|
"""Valida que la combinación de parámetros genere una geometría válida"""
|
|
"""Valida que la combinación de parámetros genere una geometría válida"""
|
|
|
H = params.get('H', 0)
|
|
H = params.get('H', 0)
|
|
@@ -609,6 +756,17 @@ class SAPSectionDesignerGUI:
|
|
|
if tw > b:
|
|
if tw > b:
|
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
|
|
+ if self.con_ref.get():
|
|
|
|
|
+ e_ref = params.get('e_ref', 0)
|
|
|
|
|
+ L_ref = params.get('L_ref', 0)
|
|
|
|
|
+
|
|
|
|
|
+ if e_ref > 0.3:
|
|
|
|
|
+ return False
|
|
|
|
|
+ if L_ref > 0.169:
|
|
|
|
|
+ return False
|
|
|
|
|
+ if L_ref < tf:
|
|
|
|
|
+ return False
|
|
|
|
|
+
|
|
|
return True
|
|
return True
|
|
|
|
|
|
|
|
def generar_matriz_sweep(self, sweep_configs, fixed_params):
|
|
def generar_matriz_sweep(self, sweep_configs, fixed_params):
|
|
@@ -687,7 +845,7 @@ class SAPSectionDesignerGUI:
|
|
|
|
|
|
|
|
ret = SapModel.PropFrame.SDShape.SetPolygon(
|
|
ret = SapModel.PropFrame.SDShape.SetPolygon(
|
|
|
nombre, # Nombre de la sección SD
|
|
nombre, # Nombre de la sección SD
|
|
|
- nombre_poligono, # Nombre del shape
|
|
|
|
|
|
|
+ nombre_poligono, # Nombre del shape
|
|
|
material, # Material
|
|
material, # Material
|
|
|
"Default",
|
|
"Default",
|
|
|
num_points, # Número de puntos
|
|
num_points, # Número de puntos
|