VISRETAIN - Решение за актуализиране на AutoLISP xref слой
В предишната част говорих за това как се държат външните връзки (по-точно техните слоеве) при visretain=1. Нека се опитаме да разрешим проблема с "неизтритите" слоеве.
Преди да напишете код, малко теория
Тук вече говорих малко за реакторите. Време е да разширите собствените си знания
И така, сред всички видове различни реактори, има отделен тип реактор: външен референтен реактор (vlr-xref-reactor). Както обикновено, той разполага с прилично количество събития, на които ще може да реагира. Няма да давам списъка - той е много дълъг (за подробности вижте книгата на N.N. Poleshchuk и P.V. Loskutov "AutoLISP и VisualLISP в средата на AutoCAD" (BHV, 2006 г.). Освен всички останали, има събитие :vlr-xrefSubcommandReloadItem - събитие, което се задейства, когато връзката се актуализира. Страхотно, нека напишем нашата обработка в него!
Първо, нека начертаем зареждащото устройство на реактора:
( if * vlr - xref * ( progn ( setq * vlr - xref * nil ) ( vlr-remove-all : vlr-xref-reactor ) ) ;_ край на progn ) ;_ край на if
( if ( not * vlr - xref * ) ( setq * vlr - xref * ( vlr-xref-reactor "kpblc-xref-reactor" ' ( ( :vlr - xrefsubcommandreloaditem . _kpblc - vlr - xref - reloaditem ) ) ) ;_ край на vlr-command-reactor ) ;_ край на setq ) ;_ край на if
Сега всъщност пишем реакционната функция:
Първият параметър на функцията е указател към реактора, който я е извикал. В момента изобщо не се интересувам. Вторият параметър е списък от две числа:
Второто число е ID на описанието на външната връзка или 0.
Изглежда, че сега всичко става съвсем просто: анализираме състоянието на visretain (ако променливата е 0, тогава не е нужно да правим нищо), състоянието на данните за първото число: ако е 3 (не виждам специален смисъл да проверявам 4),тогава правим това, от което се нуждаем:
Но въпросът е - каква обработка ще извършим? Можете, разбира се, да преминете през всички слоеве на външни връзки и да се опитате да ги разрушите. Но можете, както се казва, да показвате и обработвате слоеве само от актуализирани връзки. Какво ще правя.
Изглежда, че елементарна задача е да конвертирате идентификатор на обект в указател към него! Но AutoCAD от 2009 г. до 2016 г. включително (всички x64 версии) изхвърли грешка при опит за получаване на указател към обект. Така че трябваше да отида така:
Само такъв код направи възможно точното получаване на указател към описанието на външна връзка.
Сега комбинираме нашата проверка за visretain (cad данни) и получаване на указател към описанието на връзката:
Сега вътре в "обработката" преминаваме през слоевете, чиито имена започват с името obj и съдържат вертикална лента, и се опитваме да ги изтрием:
Естествено, ако имате нужда от нещо по-усъвършенствано (например трябва да актуализирате описанията на слоевете), тогава ще трябва да използвате ObjectDBX, за да отворите файла за връзка, да прочетете всички данни от там и т.н. Но задачата запремахване на слоеве, които липсват във външната връзка, този код ще се справи добре.