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

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

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

Оффлайн ElpanovEvgeniyАвтор темы

  • ADN
  • *
  • Сообщений: 8
  • Карма: 2
    • elpanov.com
  • Skype: ElpanovEvgeniy
Столкнулся с проблемой, в AutoCAD 2013-2014 остаются хвосты библиотек после импорта из формата DGN. Выглядит это не очень хорошо, при копировании из такого файла любого объекта через буфер, вся библиотека DGN копируется в новый файл. Причем, если она имеет размер в несколько мегабайт, то новый файл после вставки из буфера одной линии вырастает на эти несколько мегов. Само по себе это не так страшно, но время копирования вырастает во много раз и иногда доходит до получаса.

Autodesk знает о проблеме и выпустил исправление AutoCAD® DGN Hotfix, но его использование не очень удобно - требуется доступ к папке установки AutoCAD (все через админов).

 Александр Ривилис подсказал о статье Purging unwanted DGN linestyle data from an AutoCAD drawing using .NET  , которая помогла разобраться в проблеме и сделать полноценное решение проблемы из лиспа...

Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:d- (/ dgn)
  2.   ;; By ElpanovEvgeniy
  3.   ;; программа удаляет из файла DGN прокси объекты не имеющие графического отображения.
  4.   ;; Программа протестирована в AutoCAD 2013 и 2014, Civil 3D, AutoCAD MEP, AutoCAD Architecture.
  5.   (if (setq dgn (member '(3 . "ACAD_DGNLINESTYLECOMP") (entget (namedobjdict))))
  6.     (progn (setq dgn (cdr (assoc 350 dgn)))
  7.            (entmod
  8.              (append (reverse (cdr (member '(3 . "ACAD_DGNLINESTYLECOMP") (reverse (entget (namedobjdict))))))
  9.                      (cddr (member '(3 . "ACAD_DGNLINESTYLECOMP") (entget (namedobjdict))))
  10.              )
  11.            )
  12.            (entget dgn)
  13.            (foreach a (entget dgn)
  14.              (if (= (car a) 360)
  15.                (entdel (cdr a))
  16.              )
  17.            )
  18.            (entdel dgn)
  19.            ;; При необходимости можно удалить строчки по очистке файла и
  20.            ;; снять комментарии с прекомендацией самостоятельного запуска _purge.
  21.            (vl-load-com)
  22.            (repeat 3 (vla-PurgeAll (vla-get-ActiveDocument (vlax-get-acad-object))))
  23.            ;; (princ "\n Файл очищен от неиспользуемых проксиобъектов, рекомендуется очистить файл командой _purge")
  24.     )
  25.   )
  26.   (princ)
  27. )
  28. (defun c:в- () (c:d-))

ps. Программа протестирована в AutoCAD 2013 и 2014, Civil 3D, AutoCAD MEP, AutoCAD Architecture. Если будут найдены замечания, прошу сообщить мне.
Тот, кто правильно указывает на мои ошибки, — мой учитель
тот, кто правильно отмечает мои верные поступки, — мой друг
тот, кто мне льстит, — мой враг.
/Сунь Цзы/

Оффлайн ElpanovEvgeniyАвтор темы

  • ADN
  • *
  • Сообщений: 8
  • Карма: 2
    • elpanov.com
  • Skype: ElpanovEvgeniy
Как ни странно, весь код можно свести к удалению корневого словаря, после пересохранения файла, все библиотеки сами удалятся.
Код - Auto/Visual Lisp [Выбрать]
  1. (DICTREMOVE (namedobjdict) "ACAD_DGNLINESTYLECOMP")
Тот, кто правильно указывает на мои ошибки, — мой учитель
тот, кто правильно отмечает мои верные поступки, — мой друг
тот, кто мне льстит, — мой враг.
/Сунь Цзы/

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

  • Administrator
  • *****
  • Сообщений: 664
  • Карма: 98
А если после удаления такого словаря выполнить проверку файла, что будет?
Все, что сказано - личное мнение.

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

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

Оффлайн ElpanovEvgeniyАвтор темы

  • ADN
  • *
  • Сообщений: 8
  • Карма: 2
    • elpanov.com
  • Skype: ElpanovEvgeniy
Алексей Кулик, проверил, и после первого и второго варианта _audit выдает одинаковый ответ.
Тот, кто правильно указывает на мои ошибки, — мой учитель
тот, кто правильно отмечает мои верные поступки, — мой друг
тот, кто мне льстит, — мой враг.
/Сунь Цзы/

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Рекомендую очень аккуратно использовать этот лисп или удаление словаря.
У нас админы установили некоторым пользователям AutoCAD® DGN Hotfix и нашлись умельцы, которые стали использовать в Автокаде специфические типы линий, взятые из Microstation. Применение вышеуказанного лиспа или удаление корневого словаря удаляет такие типы линий и в результате они начинают отображаться просто прямыми.
Очистка средствами Autodesk (либо "_.-purge" "_o" для AutoCAD2015, либо "_dgnpurge" для AutoCAD2012-2014 с установленным Hotfix) не удаляет такие типы линий. Правда такая очистка сильно замусоренных файлов от стилей DGN происходит неимоверно долго даже на мощных машинах.
У себя в институте использую такой лисп для очистки от DGN:

Код - Auto/Visual Lisp [Выбрать]
  1. ;очистка непривязанных данных, в частности стили линий DGN
  2. (setq acd_ver (getvar "acadver")) ;получаем версию загруженного AutoCAD
  3. ;если это AutoCAD 2015, то чистим стандартным _-purge
  4. (if (= acd_ver "20.0s (LMS Tech)") (command "_.-purge" "_o"))
  5. ;если AutoCAD 2013 или 2014, то чистим командой _dgnpurge из DGN Hotfix для AutoCAD 2013-2014, появляющейся при загрузке DgnLsPurge.dll
  6. (if (or (= acd_ver "19.0s (LMS Tech)") (= acd_ver "19.1s (LMS Tech)"))
  7.  (progn
  8.   (command "_netload" "\\\\Dc\\it\\ACD\\DGNPurge\\Acad2014\\DgnLsPurge.dll") ;грузим dll из Hotfix
  9.   (command "_dgnpurge") ;и запускаем очистку dgn
  10.  )
  11. )
  12. ;если AutoCAD 2012, то чистим командой _dgnpurge из DGN Hotfix для AutoCAD 2012, появляющейся при загрузке DgnLsPurge.dll
  13. (if (= acd_ver "18.2s (LMS Tech)")
  14.  (progn
  15.   (command "_netload" "\\\\Dc\\it\\ACD\\DGNPurge\\Acad2012\\DgnLsPurge.dll") ;грузим dll из Hotfix
  16.   (command "_dgnpurge") ;и запускаем очистку dgn
  17.  )
  18. )
Файл для примера во вложении. Ситуация, скорее всего, редкая, но, тем не менее, возникла.
« Последнее редактирование: 02-11-2015, 15:13:44 от Подшиваленко Дмитрий »

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

  • Administrator
  • *****
  • Сообщений: 664
  • Карма: 98
Ну, во-первых, загрузка .NET-сборки из сетевого каталога не обязательно завершится успехом (если вообще завершится). Во-вторых, кто-то мешает прописать "специфические" типы линий в обычном lin-файле?
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 6890
  • Карма: 769
  • Рыцарь ObjectARX
  • Skype: rivilis
Во-вторых, кто-то мешает прописать "специфические" типы линий в обычном lin-файле?
Не получится. Эти DGN-овские типы линий не описываются стандартными типами линий AutoCAD. Если интересны детали, то вот статья: http://through-the-interface.typepad.com/through_the_interface/2012/12/purging-unwanted-dgn-linestyle-data-from-an-autocad-drawing-using-net.html
Если нужно, то могу перевести.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 664
  • Карма: 98
Пока не нужно, попробую самостоятельно продраться :)
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Эти DGN-овские типы линий не описываются стандартными типами линий AutoCAD.
Не все DGN-овские типы линий не описываются стандартными типами линий AutoCAD. Первый же тип линий, взятый умельцами из Microstation, который я обнаружил, были обычные кресты, которые легко описать (см. вложение в моём предыдущем посте). Зачем умельцы взяли его из Microstation - сами не умели создавать и проще было взять готовый. Попался из Microstation.
Ну, во-первых, загрузка .NET-сборки из сетевого каталога не обязательно завершится успехом (если вообще завершится). Во-вторых, кто-то мешает прописать "специфические" типы линий в обычном lin-файле?
Загрузка .NET-сборки из сетевого каталога работает нормально, ибо код уже оттестирован. Только вот с количеством обратных слэшей пришлось повозиться.
Прописать специфические типы линий в  lin-файле мысль была и есть, но есть сложности:
1. Нужно понять кто такие нестандартные типы линий использует, собрать полную библиотеку таких типов линий.
2. Насколько это возможно, попытаться описать нестандартные типы линий, взятые из Microstation, стандартными формами Акада из ltypeshp.shx без создания новых форм, чтобы было более-менее похоже. Если найдутся такие, которые нельзя описать  стандартными типами линий AutoCAD, тогда ой.
3. Объяснить 500 человекам, в том числе мало понимающим в автокаде, откуда и как брать эти типы линий, полностью перевести народ на использование типов линий, описанных в lin-файле.
4. На всё это нужна куча времени, а это не совсем моя работа, я тут энтузиазм проявляю :)

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

  • Administrator
  • *****
  • Сообщений: 6890
  • Карма: 769
  • Рыцарь ObjectARX
  • Skype: rivilis
Загрузка .NET-сборки из сетевого каталога работает нормально, ибо код уже оттестирован.
Дело не в коде, а во взаимодействии .NET Framework различных версий и Windows. Почитай: http://adn-cis.org/forum/index.php?topic=1110.msg9968#msg9968 Весьма полезные знания.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Дело не в коде, а во взаимодействии .NET Framework различных версий и Windows.
Насколько я выяснил у админов, у всех пользователей поголовно стоит одинаковая Win7x64. Тестил код на работе на Win7x64 + Acad 2015, 2014. Всё работает.

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
В продолжение темы.
Лисп, который я выложил ранее, благополучно работает и привязан к кнопочке на панели инструментов, которая ставится всем пользователям AutoCAD.
Вернее есть 2 кнопочки. 1-я привязана к варианту удаления словаря (быстрая очисткf), 2-я - к корректной очистке (выложенный ранее лисп).
Вроде народ начал потихоньку вычищать чертежи от DGN, но не все.
Появилась мысль, что народу нужно сделать некое оповещение о присутствии DGN объектов в чертеже.
Можно ли написать небольшой лисп, который бы проверял наличие DGN объектов в чертеже и в случае их присутствия выводил сообщение что-то вроде (alert "В чертеже обнаружены объекты DGN")?
Заранее благодарен за помощь :)

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

  • Administrator
  • *****
  • Сообщений: 664
  • Карма: 98
Если установить proxynotice = 1, то сам AutoCAD будет оповещать об этих (и других) прокси-объектах.
С другой стороны, можно создать лисп, выполняемый при открытии документа - он и будет вычищать все что положено. Или прописать командный реактор на сохранение документа - и там выполнять аналогичные действия.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 6890
  • Карма: 769
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно ли написать небольшой лисп, который бы проверял наличие DGN объектов в чертеже и в случае их присутствия выводил сообщение что-то вроде (alert "В чертеже обнаружены объекты DGN")?
Небольшим он не получится. Да и на лиспе врядли это реализуемо. Смысл в том, что для того, чтобы уточнить есть и нет в чертеже "объекты DGN" нужно просканировать весь чертеж (ну или как минимум до первого "объекта DGN").
Если установить proxynotice = 1, то сам AutoCAD будет оповещать об этих (и других) прокси-объектах.
Это прокси-объекты только в старых версиях AutoCAD, в которых объектов DGN небыло (или как минимум DEMANDLOAD в 0 - но так никто работать не сможет). А в нормальном виде это объекты AcDbDgnLS* (там целое семейство классов).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 664
  • Карма: 98
Добавлю: demandload желательно установить равной 2
Все, что сказано - личное мнение.

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

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