Почистить файл при открытии…

Поступило тут предложение нарисовать код, который будет чистить файл 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

Вызов и все остальное - не изменилось.



Комментарии

Есть 42 коммент. к “Почистить файл при открытии…”
  1. Максим пишет:

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

  2. itvafrolov пишет:

    вот еще одна загадка:
    возникла необходимость программно удалить внешние ссылки имеющие статус "unreferenced"
    есть ли у Вас такая программа?

  3. Кулик Алексей aka kpblc пишет:

    Такой программы нет. Да и не требовалась она как-то...
    По идее, можно пройтись по всем внешним ссылкам, получить их путь, при необходимости преобразовать их в абсолютный - и потом попробовать удалить. Но тут есть одна проблема: ненайденная ссылка может быть вставлена в другую ссылку, та - в третью, и только третья вставлена в текущий документ. Удалить такое, конечно, с наскоку не получится.

  4. gest пишет:

    Алексей, в 2017 автокаде при запуске программы через макрос ^C^C(_kpblc-autostart-purge 511); пишет ошибку

    Команда: (_kpblc-autostart-purge 511)
    ; ошибка: no function definition: _KPBLC-AUTOSTART-PURGE

    Можешь помочь?

  5. Кулик Алексей aka kpblc пишет:

    Ну, скорее всего, это означает, что соответствующий lsp не загружен. Может быть, secureload помешал загрузить.

  6. composter пишет:

    обнаружил инетересную вещь при периодическом использовании (_kpblc-autostart-purge 2047) с некоторыми динамическими блоками происходит странная вешь - дублируется полностью все содержимое блока внутри блока. т.е. в том месте где была 1 линия становится 2 , где был 1 круг становится 2 и т.д.

  7. Кулик Алексей aka kpblc пишет:

    Ну, раз "некоторые", значит, они либо сделаны как-то "не так", либо на них что-то навешано. Например, несколько параметров видимости - абсолютно недокументированные вещи, и достаточно опасные в некоторых случаях (как мне кажется). Просто так подобного не бывает.

  8. composter пишет:

    Ну получается это происходит только в тех блоках , в которых есть состояние видимости или lookup. Несолько параметров видимости не использую в практике. Да и стараюсь не загружать блоки, не использовать параметризацию, если много ручек , то лучше создать еще отдельный блок. Поэтому у меня в основном простые динамические блоки.
    Некоторые я написал потому что если аналогичные блоки по своей структуре, только надписи разные. И при открытии некоторых происходит дублирование всех элементов, даже без измений в блоке, если выйти без сохранения то результат виден не будет (например отзеркаливаение), а если просто передвинуть мышку и сохранить то видны изменения. Причем если же элемент вручную скопировать в текущей видимости, то он не будет виден в других видимостях (т.е. наследуют все параметры исходного примитива) . А в результате глюка дублированные элементы видны всех видимостях блока.

  9. Кулик Алексей aka kpblc пишет:

    Очень интересно. Подобного не "ловил" от слова никогда.
    Можно образец на любой файлообменник, а сюда ссылку? Попробую на выходных посмотреть - если не забуду ;)

  10. composter пишет:

    выложил https://yadi.sk/d/LR1cywFB3GWfCL
    синий блок выглядит нормально, но стоит зайти в редактор блоков и сохраниться, то увдите возле точки вставки блока маленький квадратик это и есть дубликат примитивов, которые не привязаны ни к каим ручкам в блоке.
    для примера выложил красный, который по сути похож на синий но с ним такого не происходит.

  11. Кулик Алексей aka kpblc пишет:

    Я, конечно, прошу прощения, но. Открыл чистый ACAD2016, открываю файл. Запускаю элементарный код

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    (defun get-count (/ ent res)
      (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

    И получаю в результате нечто типа

    1
    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 -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))
      )

    В исходном блоке уже идет дублирование примитивов. Так что проблема точно не в коде очистки )))

  12. composter пишет:

    Зря я говорил напраслину. Очисткой не пользовался, а это дублирование все равно вылезает в блоках.

  13. Кулик Алексей aka kpblc пишет:

    Еще раз: внутри самих блоков примитивы дублируются. Надо чистить (скорее всего, руками) блоки и внутри документов, и внутри библиотек, откуда они копируются.

  14. Оксана пишет:

    Алексей, добрый день, помогите пожалуйста, создаю блоки (динамические и простые окна , двери для планов разрезов) с wipeout, после очистки ExplodeAllProxy - разбивает, где найти настройку чтобы при чистке именно wipeout не разбивался.

  15. Кулик Алексей aka kpblc пишет:

    Добрый вечер! Перед выполнением ExplodeAllProxy введите команду _.wipeout и тут же ее прекратите. Ни маскировки, ни растры в таком случае не будут считаться прокси-объектами и не будут разбиваться.
    Отдельной настройки нет.

  16. vik74 пишет:

    Алексей спасибо! Все прекрасно работает на 1012. Файл, который не мог открыть, открылся без проблем и быстро. Но этот же файл (формат 2010) виснет AutoCAD 2020. Этот лисп не будет работать в 2020?

  17. Кулик Алексей aka kpblc пишет:

    Ну, вообще-то должен. Надо только ExplodeAllProxy от А.Ривилиса загрузить.
    P.S. У меня срабатывало, но я не показатель вообще ни разу :(

Поделитесь своим мнением


Я не робот.