Hola a todos. Estoy intentando usar la función "Export Assetpackage" con UNtools (2.6.2) pero me encuentro con un error bastante molesto, y espero que alguien pueda ayudarme a corregirlo. <\/P>
Debido a que estuve probando algunas otras funciones relacionadas con la carga de datos en libros de trabajo, he creado más de una red Utility en la misma geodatabase local. Esto ha resultado en que tenga nombres de clase que terminan con "_1" en la segunda red Utility que creé. Esto aplica para todos los diferentes nombres en ese modelo de red utility.
Ejemplo del problema de nombre<\/span><\/span><\/P>Cuando intento exportar esta UN a un assetpackage, obtengo el siguiente error:<\/P>"línea 623, en parse_un_class
raise ValueError("'{}' no cumplió con la expresión regular".format(name))
ValueError: 'StructureBoundary_1' no cumplió con la expresión regular"<\/P> <\/P>Si reviso la línea 623 en el archivo "common.py" a la que se refiere el error, es parte de la siguiente función:<\/P>@lru_cache()<\/EM>
def parse_un_class(class_name: str, structure_as_none: bool = False) -> Tuple:<\/EM>
"""Analiza class_name para extraer el nombre del dominio y el tipo de clase<\/EM><\/P>Args:<\/EM>
class_name (str): La ruta a la clase UN.<\/EM>
structure_as_none (bool): Devuelve Structure Network como ``None``; por defecto es ``False``.<\/EM><\/P>Returns:<\/EM>
tuple: (Nombre del dominio, tipo de clase)<\/EM><\/P>Examples:<\/EM>
>>> parse_un_class("Naper.un.ElectricLine")<\/EM>
("Electric", "Line")<\/EM>
>>> parse_un_class("C:\/con.sde\/Naper.un.Electric\/Naper.un.StructureBoundary")<\/EM>
("Structure", "StructureBoundary")<\/EM>
>>> parse_un_class("C:\/con.sde\/Naper.un.Electric\/Naper.un.StructureBoundary", structure_as_none=True)<\/EM>
(None, "StructureBoundary")<\/EM><\/P>Raises:<\/EM>
ValueError: Si ``class_name`` no es una clase UN válida.<\/EM>
"""<\/EM>
if class_name is None:<\/EM>
return None, None<\/EM><\/P># TODO: reescribir esto para manejar nombres de clase duplicados (ej StructureJunction_2)<\/EM>
name = os.path.split(class_name)[-1].rpartition('.')[-1]<\/EM>
# Usando cuantificador lazy para que Subnet se incluya con Line y no con el nombre del dominio<\/EM>
res = re.findall('(.+?)(Assembly|Device|Junction|Line|SubnetLine|Boundary|EdgeObject|JunctionObject)$',<\/EM>
name, re.IGNORECASE)<\/EM>
if not res:<\/EM>
raise ValueError("'{}' no cumplió con la expresión regular".format(name))<\/EM>
else:<\/EM>
domain, class_type = res[0]<\/EM>
# Los tipos de clase del dominio Structure son 'Structure(Junction|Line|Boundary)'<\/EM>
if domain.upper() == 'STRUCTURE':<\/EM>
class_type = "Structure" + class_type<\/EM>
if structure_as_none:<\/EM>
domain = None<\/EM>
return domain, class_type
Ahora puedo ver que el creador ha puesto un "TODO" para él/ella/ello mismo para reescribir la función y que pueda soportar nombres de clase duplicados.
¿Alguien tiene alguna idea sobre cómo podría editar parte de la función "parse_un_class(class_name: str, structure_as_none: bool = Fals) -> Tuple:" para que acepte mis elementos UN con "_1"?
Intenté editar:
res = re.findall('(.+?)(Assembly|Device|Junction|Line|SubnetLine|Boundary|EdgeObject|JunctionObject)$',
name, re.IGNORECASE)
para tener "_1" al final así:
res = re.findall('(.+?)(Assembly_1|Device_1|Junction_1|Line|SubnetLine_1|Boundary_1|EdgeObject_1|JunctionObject_1)$',
name, re.IGNORECASE)
Pero lanza el mismo error que antes. No quiero editar demasiado en lugares donde no debería hacerlo, pero he invertido MUCHO tiempo configurando el modelo para simplemente desecharlo y hacerlo otra vez.
¡Cualquier consejo, pensamiento o idea es muy bienvenido!
PD. No puedo actualizar a una versión superior de untools, ya que estoy obligado a mantenerme en la versión de nuestro servidor enterprise donde eventualmente terminará el UNM.