Некоторые особенности VISRETAIN
Системная переменная VISRETAIN существует достаточно давно и ее описание вроде бы внятно и понятно. Но вот стоит поставить ее равной 1 и вылезают некоторые моменты, предусмотреть которые я в свое время не смог.
Файлы dwg я не предоставляю - ситуацию можно смоделировать и так. Все выполняется внутри одной сессии AutoCAD. Версия AutoCAD не важна (ситуацию удалось смоделировать на AutoCAD 2009, 2013, 2016).
Создаем новый файл XRef.dwg, в котором создаются два-три новых слоя с любыми настройками (например, Layer1, Layer2, Layer3). На каждый слой помещаем хотя бы один примитив. Сохраняем файл и вставляем его как внешнюю ссылку в файл Common.dwg. Тип внешней ссылки роли не играет. В файле Common.dwg для visretain установлено значение 1. Вызовем диспетчер слоев файла Common.dwg:
Откроем ссылку XRef.dwg из-под Common.dwg. В XRef.dwf выполним удаление слоя Layer3:
Сохраняем и закрываем Xref.dwg.
Естественно, при активации окна Common.dwg AutoCAD сообщает об изменении файла внешней ссылки. Обновляем ее и смотрим на диспетчер слоев:
Интересно, но факт: слой Xref|Layer3 не удален в текущем файле! Конечно, несложно написать код наподобие
1 2 3 4 5 6 7 8 9 10 11 12 13 | (vl-load-com) (vlax-for item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (if (wcmatch (vla-get-name item) "*|*") (vl-catch-all-apply (function (lambda () (vla-delete item) ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of if ) ;_ end of vlax-for |
и "повесить" его на реактор vlr-xref-reactor, но я ожидал, что удаление слоя должно автоматически обновлять состояние внешней ссылки независимо ни от чего. Так же, как срабатывает добавление или изменение имени слоя. Программное решение без перезагрузки Common.dwg показано здесь.
При этом достаточно Common.dwg перезагрузить - и все удаления "подхватятся" вполне корректно.
Получается, что VISRETAIN сохраняет не только переопределенные цвета, типы и веса линий, а также описания слоев, но и перечень слоев - даже если их не переопределяли. А есть они на самом деле или нет - это уже дело шестнадцатое. При этом достаточно установить visretain в 0 - и все, абсолютно все! изменения в слоях файла внешней ссылки моментально отображаются в Common.dwg.