Почистить файл при открытии…
Поступило тут предложение нарисовать код, который будет чистить файл dwg при открытии. Не при сохранении, а именно при открытии.
Памятуя о документе на GoogleDocs (если лениво ходить по ссылке, документ можно забрать здесь в формате docx, а здесь - в формате pdf), нарисовался вот такой код.
Проверил на AutoCAD 2013 и 2014 x64 - вроде бы работает.
При использовании обратите внимание на параметр вызова: это сумма битов из списка
Значение бита | Пояснение |
1 | очищать графический и неграфический мусор (аналог обычного _purge) |
2 | очищать зарегистрированные приложения |
4 | проверка файла с исправлением ошибок (аналог _.audit _y) |
8 | очищать фильтры слоев |
16 | удалять историю создания твердых тел, включая вхождения в блоки (аналог команды _.brep) |
32 | удаление параметрических зависимостей, включая вхождения в блоки (аналог _.delconstrain) |
64 | при загруженном ExplodeAllProxy, demandload = 2, proxyshow = 1: разбиение графических прокси-объектов (автоматически добавляются биты 1, 2, 4) |
128 | при загруженном ExplodeAllProxy, demandload = 2, proxyshow = 1: удаление неграфических и неразбиваемых прокси-объектов (автоматически добавляются биты 1, 2, 4) |
256 | очистить следы VBA в файле |
512 | очистить назначенные материалы |
1024 | очистить словарь AcDgnLS (по решению Евгения Елпанова) |
Очистка файла от мусора и зарегистрированных приложений, а также проверка выполняется два раза.
P.S. Работа над кодом уже подходила к концу, когда выяснилось, что он уже не требуется. Блин, обидно...
Версия | Пояснение | Ссылка |
0.0.2 | Исправленный код, учитывает возможность наличия в файле маскировок (wipeout), объектов rtext и arctext | _kpblc-autostart-purge.lsp |
0.0.3 | Исправленный код, учитывающий особенности DIMPOST и проверки файлов | _kpblc-autostart-purge.lsp |
0.0.4 | Дополнительный бит (512) для удаления материалов (в некоторых случаях материалы не удалялись); добавлен отлов ошибок при удалении фильтров слоев | _kpblc-autostart-purge.lsp |
0.0.5 | Добавлена попытка принудительной загрузки ExplodeProxy*.arx | _kpblc-autostart-purge.lsp |
0.0.6 | Исправлена ошибка очистки фильтров слоев | _kpblc-autostart-purge.lsp |
0.0.7 | Добавлена принудительная очистка словаря AcDgnLS | _kpblc-autostart-purge.lsp |
Вызов и все остальное - не изменилось.
Алексей, большое Вам человеческое спасибо за проделанную работу! Сколько горьких слез пролито и нервов потрачено из-за этих перегруженных файлов чертежей.
вот еще одна загадка:
возникла необходимость программно удалить внешние ссылки имеющие статус "unreferenced"
есть ли у Вас такая программа?
Такой программы нет. Да и не требовалась она как-то...
По идее, можно пройтись по всем внешним ссылкам, получить их путь, при необходимости преобразовать их в абсолютный - и потом попробовать удалить. Но тут есть одна проблема: ненайденная ссылка может быть вставлена в другую ссылку, та - в третью, и только третья вставлена в текущий документ. Удалить такое, конечно, с наскоку не получится.
Алексей, в 2017 автокаде при запуске программы через макрос ^C^C(_kpblc-autostart-purge 511); пишет ошибку
Команда: (_kpblc-autostart-purge 511)
; ошибка: no function definition: _KPBLC-AUTOSTART-PURGE
Можешь помочь?
Ну, скорее всего, это означает, что соответствующий lsp не загружен. Может быть, secureload помешал загрузить.
обнаружил инетересную вещь при периодическом использовании (_kpblc-autostart-purge 2047) с некоторыми динамическими блоками происходит странная вешь - дублируется полностью все содержимое блока внутри блока. т.е. в том месте где была 1 линия становится 2 , где был 1 круг становится 2 и т.д.
Ну, раз "некоторые", значит, они либо сделаны как-то "не так", либо на них что-то навешано. Например, несколько параметров видимости - абсолютно недокументированные вещи, и достаточно опасные в некоторых случаях (как мне кажется). Просто так подобного не бывает.
Ну получается это происходит только в тех блоках , в которых есть состояние видимости или lookup. Несолько параметров видимости не использую в практике. Да и стараюсь не загружать блоки, не использовать параметризацию, если много ручек , то лучше создать еще отдельный блок. Поэтому у меня в основном простые динамические блоки.
Некоторые я написал потому что если аналогичные блоки по своей структуре, только надписи разные. И при открытии некоторых происходит дублирование всех элементов, даже без измений в блоке, если выйти без сохранения то результат виден не будет (например отзеркаливаение), а если просто передвинуть мышку и сохранить то видны изменения. Причем если же элемент вручную скопировать в текущей видимости, то он не будет виден в других видимостях (т.е. наследуют все параметры исходного примитива) . А в результате глюка дублированные элементы видны всех видимостях блока.
Очень интересно. Подобного не "ловил" от слова никогда.
Можно образец на любой файлообменник, а сюда ссылку? Попробую на выходных посмотреть - если не забуду
выложил https://yadi.sk/d/LR1cywFB3GWfCL
синий блок выглядит нормально, но стоит зайти в редактор блоков и сохраниться, то увдите возле точки вставки блока маленький квадратик это и есть дубликат примитивов, которые не привязаны ни к каим ручкам в блоке.
для примера выложил красный, который по сути похож на синий но с ним такого не происходит.
Я, конечно, прошу прощения, но. Открыл чистый ACAD2016, открываю файл. Запускаю элементарный код
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(setq ent (vlax-ename->vla-object (car (entsel)))
ent (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
(vla-get-effectivename ent)
) ;_ end of vla-item
) ;_ end of setq
(vlax-for subent ent
(setq subent (vl-remove-if-not
'(lambda (x) (member (car x) '(0 10 11)))
(entget (vlax-vla-object->ename subent))
) ;_ end of vl-remove-if-not
) ;_ end of setq
(setq res (cons subent res))
) ;_ end of vlax-for
(vl-sort (reverse res) (function (lambda (a b) (< (cadr (assoc 10 a)) (cadr (assoc 10 b))))))
) ;_ end of defun
И получаю в результате нечто типа
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
((0 . "LINE") (10 -5.68e-014 50.0 0.0) (11 25.0 50.0 0.0))
((0 . "LINE") (10 0.0 0.0 0.0) (11 25.0 2.84e-014 0.0))
((0 . "LINE") (10 0.0 0.0 0.0) (11 25.0 2.84e-014 0.0))
((0 . "LINE") (10 5.68e-014 -50.0 0.0) (11 -5.68e-014 50.0 0.0))
((0 . "LINE") (10 5.68e-014 -50.0 0.0) (11 -5.68e-014 50.0 0.0))
((0 . "LINE") (10 25.0 50.0 0.0) (11 75.0 50.0 0.0))
((0 . "LINE") (10 25.0 -50.0 0.0) (11 5.68e-014 -50.0 0.0))
((0 . "LINE") (10 25.0 2.84e-014 0.0) (11 75.0 8.53e-014 0.0))
((0 . "LINE") (10 25.0 50.0 0.0) (11 75.0 50.0 0.0))
((0 . "LINE") (10 25.0 -50.0 0.0) (11 5.68e-014 -50.0 0.0))
((0 . "LINE") (10 25.0 2.84e-014 0.0) (11 75.0 8.53e-014 0.0))
((0 . "LINE") (10 75.0 50.0 0.0) (11 100.0 50.0 0.0))
((0 . "LINE") (10 75.0 -50.0 0.0) (11 25.0 -50.0 0.0))
((0 . "LINE") (10 75.0 8.53e-014 0.0) (11 100.0 1.137e-013 0.0))
((0 . "LINE") (10 75.0 50.0 0.0) (11 100.0 50.0 0.0))
((0 . "LINE") (10 75.0 -50.0 0.0) (11 25.0 -50.0 0.0))
((0 . "LINE") (10 75.0 8.53e-014 0.0) (11 100.0 1.137e-013 0.0))
((0 . "LINE") (10 100.0 -50.0 0.0) (11 75.0 -50.0 0.0))
((0 . "LINE") (10 100.0 -50.0 0.0) (11 75.0 -50.0 0.0))
((0 . "LINE") (10 100.0 -50.0 0.0) (11 100.0 50.0 0.0))
((0 . "LINE") (10 100.0 -50.0 0.0) (11 100.0 50.0 0.0))
)
В исходном блоке уже идет дублирование примитивов. Так что проблема точно не в коде очистки )))
Зря я говорил напраслину. Очисткой не пользовался, а это дублирование все равно вылезает в блоках.
Еще раз: внутри самих блоков примитивы дублируются. Надо чистить (скорее всего, руками) блоки и внутри документов, и внутри библиотек, откуда они копируются.
Алексей, добрый день, помогите пожалуйста, создаю блоки (динамические и простые окна , двери для планов разрезов) с wipeout, после очистки ExplodeAllProxy - разбивает, где найти настройку чтобы при чистке именно wipeout не разбивался.
Добрый вечер! Перед выполнением ExplodeAllProxy введите команду _.wipeout и тут же ее прекратите. Ни маскировки, ни растры в таком случае не будут считаться прокси-объектами и не будут разбиваться.
Отдельной настройки нет.
Алексей спасибо! Все прекрасно работает на 1012. Файл, который не мог открыть, открылся без проблем и быстро. Но этот же файл (формат 2010) виснет AutoCAD 2020. Этот лисп не будет работать в 2020?
Ну, вообще-то должен. Надо только ExplodeAllProxy от А.Ривилиса загрузить.
P.S. У меня срабатывало, но я не показатель вообще ни разу