Ahoj všichni. Snažím se použít funkci "Export Assetpackage" s UNtools (2.6.2), ale narazil jsem na docela otravnou chybu a doufám, že mi někdo pomůže ji opravit. <\/P>
Protože jsem testoval některé další funkce týkající se načítání dat z pracovních sešitů, vytvořil jsem více než jednu Utility network ve stejné lokální geodatabázi. To vedlo k tomu, že mám názvy tříd končící na "_1" v druhé Utility network, kterou jsem vytvořil. Toto platí pro všechny různé názvy v tomto modelu utility network.
Příklad problému s názvem<\/span><\/span><\/P>Když se pokusím exportovat tento UN do assetpackage, dostanu následující chybu:<\/P>"line 623, in parse_un_class
raise ValueError("'{}' did not satisfy regex".format(name))
ValueError: 'StructureBoundary_1' did not satisfy regex"<\/P> <\/P>Když se podívám na řádek 623 v souboru "common.py", na který chyba odkazuje, je součástí následující funkce:<\/P>@lru_cache()<\/EM>
def parse_un_class(class_name: str, structure_as_none: bool = False) -> Tuple:<\/EM>
"""Parses class_name to extract the domain name and class type<\/EM><\/P>Args:<\/EM>
class_name (str): Cesta ke třídě UN.<\/EM>
structure_as_none (bool): Vrátí Structure Network jako ``None``; výchozí hodnota je ``False``.<\/EM><\/P>Returns:<\/EM>
tuple: (Název domény, typ třídy)<\/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: Pokud ``class_name`` není platná třída UN.<\/EM>
"""<\/EM>
if class_name is None:<\/EM>
return None, None<\/EM><\/P># TODO: přepsat toto tak, aby zvládalo duplicitní názvy tříd (např. StructureJunction_2)<\/EM>
name = os.path.split(class_name)[-1].rpartition('.')[-1]<\/EM>
# Použití lazy kvantifikátoru, aby Subnet byl zahrnut s Line a ne jako název domény<\/EM>
res = re.findall('(.+?)(Assembly|Device|Junction|Line|SubnetLine|Boundary|EdgeObject|JunctionObject)$',<\/EM>
name, re.IGNORECASE)<\/EM>
if not res:<\/EM>
raise ValueError("'{}' did not satisfy regex".format(name))<\/EM>
else:<\/EM>
domain, class_type = res[0]<\/EM>
# Typy tříd domény Structure jsou '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
Nyní vidím, že tvůrce si dal "TODO", aby si tuto funkci přepsal tak, aby podporovala duplicitní názvy tříd.
Má někdo nápad, jak bych mohl upravit část funkce "parse_un_class(class_name: str, structure_as_none: bool = Fals) -> Tuple:" tak, aby akceptovala mé "_1" UN prvky?
Zkoušel jsem upravit:
res = re.findall('(.+?)(Assembly|Device|Junction|Line|SubnetLine|Boundary|EdgeObject|JunctionObject)$',
name, re.IGNORECASE)
Aby měl na konci "_1", takto:
res = re.findall('(.+?)(Assembly_1|Device_1|Junction_1|Line|SubnetLine_1|Boundary_1|EdgeObject_1|JunctionObject_1)$',
name, re.IGNORECASE)
Ale vyhazuje stejnou chybu jako předtím. Nechci příliš zasahovat do míst, kde nemám co dělat, ale strávil jsem PŘÍLIŠ mnoho času nastavováním modelu jen proto, abych ho zahodil a udělal znovu.
Jakékoliv tipy, myšlenky nebo nápady jsou velmi vítány!
PS. Nemohu upgradovat na vyšší verzi untools, protože jsem nucen držet se verze našeho enterprise serveru, kde nakonec UNM skončí.