úterý 30. října 2012

Regapps

V AutoCADu a dalších produktech na něm založených se můžeme často setkat s neúměrně velkými výkresy jejichž chování je značně pomalé. Příčinou mohou být Regapps – Registrované aplikace. Níže uvádíme upravený a mírně doplněný překlad příspěvku Toma Stoeckela z blogu Without a Net, který se této problematice podrobně věnuje.

Regapp je zkratka pro registrované aplikace. Pomocí jednoho z Autodeskem poskytovaného programovacího rozhraní - APIs jako je AutoLISP nebo Object ARX, je možné připojit k objektům ve výkresu další data (XData). XData umožňují připojit k objektům různé typy dat, které se ukládají společně s výkresem. XData existují již velmi dlouho a jsou stále hojně využívána pro svou efektivitu (při malém množství dat) a pro snadné zapisování.

XData jsou seskupena pod názvem registrované aplikace. Aby mohla být XData identifikována, je jméno registrované aplikace vyžadováno AutoCADem nebo jiným produktem. Aby aplikace mohla číst a ukládat XDAta musí mít jedinečný identifikátor – Regapp ID. Takže jméno registrované aplikace nebo ID je identifikátor XDat, která jsou nebo byla připojena k objektům ve výkresu. Pokud chceme zjistit, jaké identifikátory registrovaných aplikací existují ve výkresu můžeme spustit následující LISP:

(defun c:ListRegappIDs (/ appname)
  (if (setq appname (tblnext "appid" T))
    (princ "\nRegistered application IDs in drawing:")
  )
  (while appname
    (princ (strcat "\n" (cdr (assoc 2 appname))))
    (setq appname (tblnext "appid"))
  )
  (princ)
)

Dokonce i když tento LISP spustíme v čistém výkresu uvidíme jako výsledek několik jmen registrovaných aplikací. Jakékoliv registrované aplikace jejichž jméno začíná ACAD například AcadAnnotative, označuje aplikace vytvořené Autodeskem. Autodesk doporučuje vývojářům, aby používali jména registrovaných aplikací s předponou, která je unikátní a specifická pro tvůrce aplikace. To pomůže zabránit případným kolizím s jmény jiných registrovaných aplikací a dále pomáhá identifikovat autora registrované aplikace. Toto doporučení není ale vždy respektováno a můžeme se setkat s identifikátory registrovaných aplikací, z nichž se nedá zjistit kdo a za jakým účelem je vytvořil. Autodesk vytváří jednoduše identifikovatelné Regapp IDs ale mnoho vývojářů třetích stran vytváří stovky a tisíce registrovaných aplikací pro uložení dat jejich aplikace a to často bez možnosti jasné identifikace odkud tato data pocházejí. Možná, že mnoho Regapp IDs, která vidíme jsou používány a referovány na objekty ve výkresu, ale možná že ne. Bohužel pokud jsou objekty s připojenými XDaty z výkresu smazány identifikátory registrovaných aplikací zůstávají v tabulce symbolů ID aplikací, dokud nejsou z výkresu manuálně smazány. A tím se dostáváme k podstatě problému.

Problém s nadbytkem identifikátorů registrovaných aplikací (Regapp IDs)

Nadbytek Regap IDs, které již nejsou referovány k žádnému objektu ve výkresu může mít na tento výkres negativní vliv. Nadbytečné Regap IDs mohou výrazně zvětšit velikost výkresu a zpomalit chování AutoCADu. Speciálně se to týká operací jako je otevírání, tisk, eTransmit a dalších, při kterých se musí prohledat celá databáze výkresu.

Jeden uživatel mi poslal výkres, který obsahoval 109 337 Regapp IDs a měl velikost 2.37 MB. Po vyčištění nepoužívaných Regapp IDs zůstalo ve výkresu jen 46 Regapp IDs a velikost výkresu klesla na 459 KB. Tento výkres tedy obsahoval přes 109 000 Regapp IDs, které již nebyly navázány na žádný objekt, které ale zároveň zabíraly 80% velikosti výkresu.

Aby byla celá problematika ještě horší, mohou se Regapp IDs šířit do dalších výkresů prostřednictvím externích referencí. Jestliže výkres s Regapp IDs připojíme do jiného výkresu jako externí referenci, jsou tyto identifikátory klonovány do hostitelského výkresu, kde trvale zabírají místo. dokonce i když externí referenci z výkresu odpojíme Regapp IDs v hostitelském výkresu zůstanou. Představme si veliký projekt na síti, kde do tisíce výkresů je jako externí reference vložen jeden společný výkres, který obsahuje veliké množství nereferovaných Regapp IDs. Po připojení xrefu do každého souboru budou všechny soubory obsahovat kopii Regapp IDs a to ať je ve výkresu potřebujeme nebo ne. Každý z výkresů tak může být poznamenán problémy s velikostí a rychlostí, které byly popsán výše.

První otázka, kterou často slýchám je “Proč Autodesk neumožňuje nastavit nějakou systémovou proměnnou tak, aby umožnil zablokovat načítání Regapp IDs, když se výkres otevírá?” Problém tohoto přístupu je v tom, že to není bezpečné. I když nejsou identifikátory registrovaných aplikací připojeny k žádným objektům může být jejich načítání oprávněné. Jejich nenačtení by mohlo mít důsledky jak pro AutoCAD tak pro aplikace třetích stran, která přes tyto identifikátory načítají svá data. Bylo by to jako zavést systémovou proměnnou, která by řídila, zda se budou načítat bloky z externích referencí, nebo externí reference jako celek. Jsou to potenciálně důležitá data, která nelze takto regulovat. Mohli bychom vyzkoušet takový způsob otevírání výkresů, při kterém by se načetly jen ty Regapp IDs, které jsou skutečně referovány. Tím by se ovšem výrazně prodloužila doba otevírání takového výkresu. Prozatím nejbezpečnější způsob jak tento problém vyřešit je manuální odstranění Regapp IDs.

Pro jednotlivé výkresy mohou být nereferované Regapp IDs vymazány použitím příkazu –PURGE (v cz verzi _-PURGE) a následným vybráním volby Regapp. Tato možnost není přístupní přes dialog Purge, který se objeví po zavolán příkazu PURGE ( v cz verzi _PURGE). Je nutno použít bezdialogovou formu příkazu.

Command: -purge

Enter type of unused objects to purge
[Blocks/Dimstyles/LAyers/LTypes/MAterials/MUltileaderstyles/Plotstyles/SHapes/te
xtSTyles/Mlinestyles/Tablestyles/Visualstyles/Regapps/Zero-length
geometry/Empty text objects/All]: R
Enter name(s) to purge <*>:
Verify each name to be purged? [Yes/No] <Y>: n
Deleting registered application "ACAD_DSTYLE_DIM_EXT1_LINETYPE".
Deleting registered application "ACAD_DSTYLE_DIM_EXT2_LINETYPE".
Deleting registered application "ACAD_DSTYLE_DIM_LINETYPE".
Deleting registered application "ACAD_EXEMPT_FROM_CAD_STANDARDS".
Deleting registered application "ACAD_MATERIAL_MAPPER".
Deleting registered application "ACAD_MLEADERVER".
Deleting registered application "AcadAnnoAV".
Deleting registered application "AcadAnnoPO".
Deleting registered application "ACAUTHENVIRON".
Deleting registered application "AEC_DWGVARSSETUP_DATA".
Deleting registered application "PalladioXData".
Deleting registered application "RAK".
12 registered applications deleted.

Command:

Tento postup je ale značně zdlouhavý v případě, že máme velké množství výkresů, protože musíme každý výkres zvlášť otevřít a spustit v něm příkaz na čištění. Navíc tímto způsobem nevyčistíme Regapp IDs u výkresů s připojenými externími referencemi, takže tyto výkresy musíme čistit samostatně. Pro rychlejší a důkladnější čištění výkresů od nereferovaných Regapp IDs můžeme použít Regapp ID Cleanup Utility. Pomocí tohoto nástroje je možné odebrat nereferované Regapp IDs z více výkresů nebo složek obsahujících výkresy a ze všech externích referencí, které jsou do výkresů připojeny a to vše v jedné operaci. Vzhledem k tomu, že nástroj běží mimo aplikaci AutoCADu, může vyčistit více výkresů za méně času než manuální čištění anebo čištění pomocí skriptu. Protože se Regapp IDs mohou šířit do dalších výkresů přes připojené externí reference, je tento nástroj užitečný především pro firmy, které získávají neznámé výkresy od konzultantů a dodavatelů a chtějí si zajistit čistotu těchto podkladů předtím než je umístí na svou síť pro potřebu ostatních.

Regapp ID Cleanup Utility můžete stáhnout zde.

překlad a úprava Jan Panoch

Žádné komentáře:

Okomentovat