Очистка файлов от ненужных данных LineStyle DGN в AutoCAD.

Автор Тема: Очистка файлов от ненужных данных LineStyle DGN в AutoCAD.  (Прочитано 133165 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вообще можно попробовать такой код:
Код - Auto/Visual Lisp [Выбрать]
  1. (if (setq dgn (member '(3 . "ACAD_DGNLINESTYLECOMP") (entget (namedobjdict))))
  2.   (alert "В чертеже возможно есть объекты DGN")
  3. )
Но не уверен, что он даст 100%-ый результат.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Подшиваленко Дмитрий

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Александр Ривилис, спасибо.
В принципе этот код работает, но в связи со спецификой организации (совместное использование Microstation и AutoCAD), окошко вылазит на многих чертежах. Видимо небольшое количество DGN объектов перекочевало в чертежи AutoCAD, но при этом файл весит адекватно и открывается быстро. Но есть файлы, которые весят по 25мегабайт и открываются очень долго, но при этом содержат всего лишь десяток обычных отрезков. Скорее всего придётся попробовать пойти по пути подсчёта количества объектов DGN, как в теме http://forum.dwg.ru/showthread.php?p=1527693#post1527693.

Оффлайн Подшиваленко Дмитрий

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Написал лисп для подсчёта DGN объектов. На небольших файлах он отрабатывает быстро, а на файле объёмом 25Мб уже минут 20 жду когда же вылезет окошко с количеством DGN объектов... Это даже дольше, чем корректная очистка от DGN средствами AutoDesk. В автозагрузку людям такой лисп пихать нельзя :(
Попутно более подробно выяснил в какой момент исчезают линии DGN после удаления словаря с DGN.
После команды (DICTREMOVE (namedobjdict) "ACAD_DGNLINESTYLECOMP") появляются неиспользуемые блоки с именами *A####. После их очистки стандартным purge и регенерации исчезает визуальное отображение линий DGN и появляются неиспользуемые типы линий.
На файле без единого объекта AutoCAD размером 25Мб Audit проверил 588900 объектов, после удаления словаря и очистки от блоков и типов линий - 410700 объектов.
Может кому эта информация и понадобится.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
На небольших файлах он отрабатывает быстро, а на файле объёмом 25Мб уже минут 20 жду когда же вылезет окошко с количеством DGN объектов...
А зачем нужно знать точное количество? Скажем если их больше 100 (значение можешь сам прикинуть) то прекращать подсчет и выдавать сообщение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Подшиваленко Дмитрий

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
А зачем нужно знать точное количество? Скажем если их больше 100 (значение можешь сам прикинуть) то прекращать подсчет и выдавать сообщение.
Логично. Что-то я про это не подумал. Спасибо большое за мысль :). Попробую поправить код на лиспе. Просто я лисп практически не знаю, пишу по примерам из других лисп программ.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Как вариант - во вложении
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Подшиваленко Дмитрий

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Как вариант - во вложении
О, Алексей, наконец-то :) То что нужно! Спасибо огромное! :)
А можно ещё небольшую просьбу по этому лиспу?
Надо сравнить количество записей словаря с определенным числом (скажем 1000) и выводить сообщение (лучше alert) только при превышении этого числа?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Да там вроде ничего такого сверх :)
Значение "зашито в код":
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (defun checkdgn (doc / dict _val)
  4.   (if (not doc)
  5.     (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  6.     ) ;_ end of if
  7.   (setq _val 100)
  8.   (if (and (= (type (setq dict (vl-catch-all-apply
  9.                                  (function (lambda () (vla-item (vla-get-dictionaries doc) "acad_dgnlinestylecomp")))
  10.                                  ) ;_ end of vl-catch-all-apply
  11.                           ) ;_ end of setq
  12.                     ) ;_ end of type
  13.               'vla-object
  14.               ) ;_ end of =
  15.            (> (vla-get-count dict) _val)
  16.            ) ;_ end of and
  17.     (alert
  18.       (strcat "Обнаружен словарь DGN, количество записей " (vl-princ-to-string (vla-get-count dict)))
  19.       ) ;_ end of princ
  20.     ) ;_ end of if
  21.   (princ)
  22.   ) ;_ end of defun
Пример вызова:
Код - Auto/Visual Lisp [Выбрать]
  1. (checkdgn nil) ; Проверка в текущем документе

Значение передается как один из параметров:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (defun checkdgn (doc value / dict)
  4.   (if (not doc)
  5.     (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  6.     ) ;_ end of if
  7.   (if (not value)
  8.     (setq value 100)
  9.     ) ;_ end of if
  10.   (if (and (= (type (setq dict (vl-catch-all-apply
  11.                                  (function (lambda () (vla-item (vla-get-dictionaries doc) "acad_dgnlinestylecomp")))
  12.                                  ) ;_ end of vl-catch-all-apply
  13.                           ) ;_ end of setq
  14.                     ) ;_ end of type
  15.               'vla-object
  16.               ) ;_ end of =
  17.            (> (vla-get-count dict) value)
  18.            ) ;_ end of and
  19.     (alert
  20.       (strcat "Обнаружен словарь DGN, количество записей " (vl-princ-to-string (vla-get-count dict)))
  21.       ) ;_ end of princ
  22.     ) ;_ end of if
  23.   (princ)
  24.   ) ;_ end of Defun
Пример вызова:
Код - Auto/Visual Lisp [Выбрать]
  1. (checkdgn nil nil) ; проверка текущего документа, сообщение выводится, если записей больше 100
  2. (checkdgn nil 2000) ; проверка текущего документа, сообщение выводится, если записей больше 2000
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Добавлю: если будет предоставлен образец с тысячами (или десятками тысяч) подобных записей, возможно, появится вариант другого решения. У меня подобных файлов нет - и уже очень давно.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Подшиваленко Дмитрий
У меня есть сомнение в том, что алгоритм Алексея будет работать достаточно быстро. Мне кажется, что ActiveX тут не поможет и нужен другой подход через чистый AutoLISP. Интересно было бы, что бы ты проверил на своём 25Мб-ном файле, если у тебя еще остался оригинал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Подшиваленко Дмитрий

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Да там вроде ничего такого сверх
Алексей, для тех кто постоянно пишет на лиспе - да, а для того, кто этот лисп изучал 17 лет назад в институте и больше с ним не сталкивался - ну сам понимаешь :)
Тем более VisualLisp. Я только Basic и иже с ним всякие VBA знаю :)
За второй код спасибо :)
Попутно появились некоторые мысли.
1. Насколько я понял, коду всё равно, какой словарь проверять. То есть ему можно подсунуть тот же ACAD_SCALELIST и он выдаст количество масштабов (только что проверил, результат правильный). В связи с этим мысль. Можно сделать эту функцию универсальной, передавать ей имя словаря, а она будет возвращать количество записей и уже вне функции сравнивать количество записей словаря с адекватным количеством и выдавать alert?
2. Реально ли узнать количество используемых и неиспользуемых записей словаря? (Что-то типа prePurge?) :)
Добавлю: если будет предоставлен образец с тысячами (или десятками тысяч) подобных записей, возможно, появится вариант другого решения. У меня подобных файлов нет - и уже очень давно.
У меня есть сомнение в том, что алгоритм Алексея будет работать достаточно быстро. Мне кажется, что ActiveX тут не поможет и нужен другой подход через чистый AutoLISP. Интересно было бы, что бы ты проверил на своём 25Мб-ном файле, если у тебя еще остался оригинал.
Код отрабатывает мгновенно :) То что нужно! Количество записей словаря acad_dgnlinestylecomp в этом 25-Мб файле - 398993.
P.S. Прикрепить файл не получится, ибо в самом сильно сжатом архиве файл занимает 10,5Мб, а форум не даёт прикрепить больше 10Мб...

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Да, можно подставить любой словарь - хоть масштабы, хоть фильтры слоев, хоть что. Имя только менять - и все.
Насчет "используемые-неиспользуемые": не уверен, что это легко реализуемо. Можно попытаться, конечно, удалять объект, и, если это удалось, тут же его восстанавливать - но мне такой подход не нравится на интуитивном уровне.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Ну, в принципе, можно сделать и многотомный архив ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Подшиваленко Дмитрий

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Ну, в принципе, можно сделать и многотомный архив
Была такая мысль, но это тогда в двух сообщениях только. Первая часть в предыдущем посте.
Да, можно подставить любой словарь - хоть масштабы, хоть фильтры слоев, хоть что. Имя только менять - и все.
Алексей, я имел ввиду, что не мог бы ты сам подкорректировать код на лиспе, чтобы в функцию передавать имя словаря, а функция возвращала бы количество записей :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Код отрабатывает мгновенно :) То что нужно! Количество записей словаря acad_dgnlinestylecomp в этом 25-Мб файле - 398993.
Отлично. Значит я ошибался.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение