четверг, 13 ноября 2014 г.

Очищаем файлы от DGN-записей

Вчера весь рабочий день радовалась как ребенок простому решению. 
У моих пользователей назрела глобальная проблема в виде разрастания объемов файлов, количества типов линий и прочего мусора.
В условиях использования внешних ссылок...и, к сожалению, в условиях, когда пользователь не создает ничего нового, а "тупо" копирует объекты из файла в файл, проблема начала приобретать катастрофический характер. В первые же дни работы над этой проблемой, файл-родоначальник стал называться "вирусным", но...что это за файл так и не удалось определить.

Проблема в том, что когда вы подключаете вирусный файл внешней ссылкой, все типы линий автоматически копируются в ваш файл, а если их 9 с лишним тысяч, не содержащий никаких геометрических объектов, файл начинает "весить" десятки мегабайтов.
Windows XP, недостаточное количество оперативное памяти - 32битный AutoCAD начал выдавать постоянные Fatal Error. Ну, к слову, AutoCAD 2012 и в 64битном варианте тоже не всегда реагировал корректно, съедая 11 гигабайт оперативки из 12.

Лояльность пользователей ко мне резко снизилась, мы постоянно конфликтовали на почве моего безучастия в вопросе "Почему выходит Fatal Error?". В итоге мне пришлось столкнуться с проблемой в лоб и опробовать все возможные методы решения следующей задачи: удалить типы линий, которые не удаляются стандартным методом.

Для начала я решила установить все сервис-паки и хотфиксы с сайта: http://knowledge.autodesk.com/support/autocad/downloads 
Затем опробовала на "вирусных" файлах ExplodeProxy, успехом это не увенчалось, я выключила рабочую машину и ушла домой.

Через некоторое время, в условиях работы без выходных, один из пользователей в открытую спихнул на меня задачу: из файла в файл ничего не копируется (несмотря на то, что буквально за пару часов до этого я делала рассылку по инструкции от Андрея Михайлова: как очистить файлы). В таких случаях я первым делом использую ExplodeProxy, которые вынесены у меня на панель САПР, созданную в корпоративном файле адаптации. 
И результат был неожиданным:



Экспериментом на одной из пользовательских машин выяснилось, что такой эффект имеет DGN Hotfix. Файлы полны так называемых DGN-записей. У меня есть несколько мыслей, откуда взялся родоначальник проблемы:

1. Наследил СПДС GraphiCS
2. Наследил GeoSeries (GeoSolution)
3. Наследил GeoniCS
4. Пришел сторонний файл с наличием проблемы...


Но установка хотфикса требовала длительных манипуляций на локальной машине, коих у меня около 300. Постоянные запросы в техподдержку "очистить файл" надоели и с одним из продвинутых пользователей мы пришли к выводу создать кнопку, которая будет копировать файлы с сетевого репозитория, запускать Netload, а затем DGNPurge.

Я потерялась на этапе запуска Netload в AutoLISP. В связи с чем обратилась к Алексею Кулику, он же нашел макрос от Евгения Елпанова. Его было достаточно прописать в команду и добавить кнопку.
Макрос выглядит крайне просто, в суть его я даже не стала вдаваться:

^C^C(DICTREMOVE (namedobjdict) "ACAD_DGNLINESTYLECOMP");

Первый эксперимент был на файле в 7МБ...процедура отработала в доли секунд, размер файла уменьшился более, чем в 7 раз!

Поэтому, давайте вместе скажем спасибо Евгению Елпанову за такое легкое решение.

Я разместила данный макрос в виде кнопки на панели САПР корпоративного меню:


Иконка отрисовывалась стандартными средствами AutoCAD вручную (CL - от слова Clean), а как создать такую кнопку можете прочитать тут

Далее мои действия были стандартными в процессе моей работы. Создалась рассылка о добавлении нового функционала, указаны методы использования и пояснения, почему изначально возникла проблема. В ответ пришло достаточное количество положительных отзывов в виде "мы ждали эту кнопку", "это то, что нам нужно" ит.д.

Для меня же результат превзошел все ожидания: после рассылки в техподдержку по AutoCAD (около 6 часов рабочего времени) не поступило ни одного запроса. В ближайшее время я ухожу в отпуск и одна из самых трудоемких по техподдержке задач решена. Своим коллегам я просто объяснила как включить данную панель.

План на усовершенствование: добавить к макросу _.audit и _.purge для бОльшей эффективности.
Есть 2 варианта решения данной проблемы:
1. Добавить код в макрос
2. Написать lsp-файл

Я не программист и бОльшую часть кода мне делает Леша, хотя читать и править существующий код уже могу, иногда криво.

Мои пользователи в большом количестве работают с GeoSeries и GeoSolution, что дает мне право утверждать, что DGN-записи появились именно оттуда. И процедура, которую Леша использует в лиспах, ломает ассоциативность штриховки, поднимает на передний план маскировки...Меня такой вариант не устраивает, лезть в дела разработчиков ПОИНТа нет никакого желания, поэтому я выбрала вариант 1.
Макрос выглядит следующим образом:

^C^C(dictremove (namedobjdict) "ACAD_DGNLINESTYLECOMP");_.audit;_y;_.-purge;_a;*;_n;_.-purge;_r;*;_n;

Для варианта 2, можете скачать лисп тут
Команда для неумеющих читать код: fullpurge
Как создать кнопку, напоминаю, читать тут