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

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

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

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Наверняка при "чистке" убивались словари, которые использует Civil - вот и результат.
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Это приложение чистит только (!!!) неиспользованные зарегистрированные приложения.
Ну так и мы чистили только неиспользованные зарегистрированные приложения командой (command "_.-purge" "_r" "*" "_n").
Наверняка при "чистке" убивались словари, которые использует Civil - вот и результат.
Словари не трогались вроде бы...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну так и мы чистили только неиспользованные зарегистрированные приложения командой (command "_.-purge" "_r" "*" "_n").
AutoCAD (Civil 3D) 2015 SP2? Тогда нужен еще такой Fix: https://knowledge.autodesk.com/support/autocad/downloads/caas/downloads/content/autodesk-C2-AE-autocad-C2-AE-2015-sp2-xref-hotfix.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И ещё никто не ответил на вопрос, можно ли отключить импорт НЗП и МА при подключении ссылки?
Нельзя. Это принципиальное ограничение.
P.S. Алексей, а какой командой вызывается символьная таблица?

О чем речь? Это вопрос Алексею или всё-таки мне по поводу этой картинки:


 
Если речь о ней, то это утилита ARXDBG, входящая в состав ObjectARX SDK. Взять готовую можно здесь (в зависимости от версии AutoCAD):
http://www.maestrogroup.com.ua/support/ArxDbg2007.zip
http://www.maestrogroup.com.ua/support/ArxDbg2010.zip
http://www.maestrogroup.com.ua/support/ArxDbg2013.zip
http://www.maestrogroup.com.ua/support/ArxDbg2015.zip
http://www.maestrogroup.com.ua/support/ArxDbg2017.zip
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Реактор сработает только после собственно вставки ссылки / блока, т.е. файл уже выбран и вставлен. "Перед" вставкой, когда файл еще не выбран, смысла в реакторе нет. Отследить, какой файл выбран, лиспом невозможно.
И для режима "после вставки" можно только сообщить о факте загрязнения текущего чертежа (и, возможно, исходного). Ну почистить текущий и вставленный - по желанию. Надо?
P.S. Кстати, такое решение не отследит программную вставку ссылки через механизм ActiveX, учти.
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Надо?
Надо, конечно :)
Кстати, такое решение не отследит программную вставку ссылки через механизм ActiveX
Так может логичнее было бы сделать реактор на сохранение файла (именно перед сохранением, вроде BeginSave)? Если возможно... Тогда и не надо отслеживать, хотя не принципиально, думаю народ у нас таким вряд ли пользуется.

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Итак, если я правильно понял задачу:
1. После вставки внешней ссылки или блока проверить количество масштабов аннотаций, объектов AcDgnLS, зарегистрированных приложений. Если разница с предыдущим состоянием превышает какое-то значение, вывести alert с предупреждением о необходимости "вотпрямщас" чистить файлы
2. После вызова команды сохранения / закрытия файла или при выходе из AutoCAD опять же, проверить масштабы аннотаций, AcDgnLS, зарегистрированные приложения. Если по какому-то из параметров количество превышает какое-то значение, опять-таки "вотпрямщасгорит!" чистить файл.
Так? Или еще что-то надо добавлять? Честно скажу - очень не хочется по тысяче раз переписывать один и тот же код.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
или при выходе из AutoCAD
Лиспом ты можешь отловить это, но не сможешь отказаться от выхода. Т.е. очистить уже не получится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Так? Или еще что-то надо добавлять? Честно скажу - очень не хочется по тысяче раз переписывать один и тот же код.
Алексей, в принципе всё так, только может достаточно будет реактора на сохранение файла (без реактора на ссылки), если он правильно сработает?
Логично будет сделать отдельный алерт на каждое превышение (МА, НЗП, DGN)?
Проверку количества DGN и масштабов аннотаций может сделать вызовом последнего варианта функции проверки словаря (check-dict2)?

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Александр Ривилис, так я не собираюсь чистить :) Я собираюсь максимум - проинформировать ;)
Подшиваленко Дмитрий, десятки алертов делать? Неудобно будет. По-быстрому, без тестирования:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (defun adn-save-settings ()
  4.   (setq *adn-doc*      (vla-get-activedocument (vlax-get-acad-object))
  5.         *adn-settings* (append (mapcar (function (lambda (x / o)
  6.                                                    (list (cons "name" (car x))
  7.                                                          (cons "obj" (setq o (vlax-get-property *adn-doc* (car x))))
  8.                                                          (cons "count" (vla-get-count o))
  9.                                                          (cons "crit" (cdr x))
  10.                                                          ) ;_ end of list
  11.                                                    ) ;_ end of lambda
  12.                                                  ) ;_ end of function
  13.                                        ;; Первый элемент в точечной паре - имя свойства документа
  14.                                        ;; Второй - критичная разница между стартом и последним сохранением
  15.                                        '
  16.                                         (("registeredapplications" . 20)
  17.                                          ;; Следующие элементы - для примера
  18.                                          ("textstyles" . 10)
  19.                                          ("dimstyles" . 10)
  20.                                          )
  21.                                        ) ;_ end of mapcar
  22.                                (mapcar (function
  23.                                          (lambda (x / d)
  24.                                            (list (cons "name" (car x))
  25.                                                  (cons "obj"
  26.                                                        (setq d (vl-catch-all-apply (function (lambda () (vla-item (vla-get-dictionaries *adn-doc*) (car x))))))
  27.                                                        ) ;_ end of cons
  28.                                                  (cons "count"
  29.                                                        (if (and (= (type d) 'vla-object) (vlax-property-available-p d 'count))
  30.                                                          (vla-get-count d)
  31.                                                          0
  32.                                                          ) ;_ end of if
  33.                                                        ) ;_ end of cons
  34.                                                  (cons "crit" (cdr x))
  35.                                                  ) ;_ end of list
  36.                                            ) ;_ end of lambda
  37.                                          ) ;_ end of function
  38.                                        ;; Первый элемент в точечной паре - имя словаря
  39.                                        ;; Второй - критичная разница между стартом и последним сохранением
  40.                                        '
  41.                                         (("acad_scalelist" . 15) ("acad_dgnlinestylecomp" . 0))
  42.                                        ) ;_ end of mapcar
  43.                                ) ;_ end of append
  44.         ) ;_ end of setq
  45.   ) ;_ end of defun
  46.  
  47. (adn-save-settings)
  48.  
  49. (if *adn-vlr-cmd*
  50.   (progn (vl-remove *adn-vlr-cmd*) (setq *adn-vlr-cmd* nil))
  51.   ) ;_ end of if
  52.  
  53. (if (not *adn-vlr-cmd*)
  54.   (setq *adn-vlr-cmd* (vlr-command-reactor "adn-cmd-reactor" '((:vlr-commandwillstart . _adn-vlr-cmd-start))))
  55.   ) ;_ end of if
  56.  
  57. (defun _adn-vlr-cmd-start (react cmd / datas)
  58.   (setq cmd (strcase (car cmd)))
  59.   (cond
  60.     ((member cmd '("QSAVE" "SAVE" "SAVEAS"))
  61.      (if (setq datas
  62.                 (vl-remove-if
  63.                   (function (lambda (x) (or (not x) (not (cdr (assoc "count" x))) (< (cdr (assoc "count" x)) 0))))
  64.                   (mapcar (function
  65.                             (lambda (item / o)
  66.                               (cond ((and (= (type (setq o (cdr (assoc "obj" item)))) 'vla-object) (vlax-property-available-p o 'count))
  67.                                      (list (assoc "name" item)
  68.                                            (cons "count" (- (vla-get-count o) (cdr (assoc "count" item)) (cdr (assoc "crit" item))))
  69.                                            ) ;_ end of list
  70.                                      )
  71.                                     ((and (/= (type (cdr (assoc "obj" item))) 'vla-object)
  72.                                           (= (type
  73.                                                (setq o (vl-catch-all-apply
  74.                                                          (function (lambda () (vla-item (vla-get-dictionaries *adn-doc*) (cdr (assoc "name" item)))))
  75.                                                          ) ;_ end of vl-catch-all-apply
  76.                                                      ) ;_ end of setq
  77.                                                ) ;_ end of type
  78.                                              'vla-object
  79.                                              ) ;_ end of =
  80.                                           (vlax-property-available-p o 'count)
  81.                                           ) ;_ end of and
  82.                                      (list (assoc "name" item) (- (cons "count" (vla-get-count o)) (cdr (assoc "crit" item))))
  83.                                      )
  84.                                     ((and (/= (type (cdr (assoc "obj" item))) 'vla-object)
  85.                                           (= (type
  86.                                                (setq o (vl-catch-all-apply (function (lambda () (vlax-get-property *adn-doc* (cdr (assoc "name" item)))))))
  87.                                                ) ;_ end of type
  88.                                              'vla-object
  89.                                              ) ;_ end of =
  90.                                           (vlax-property-available-p o 'count)
  91.                                           ) ;_ end of and
  92.                                      (list (assoc "name" item)
  93.                                            (cons "count"
  94.                                                  (- (vla-get-count o)
  95.                                                     (cond ((cdr (assoc "count" item)))
  96.                                                           (t 0)
  97.                                                           ) ;_ end of cond
  98.                                                     (cdr (assoc "crit" item))
  99.                                                     ) ;_ end of -
  100.                                                  ) ;_ end of cons
  101.                                            ) ;_ end of list
  102.                                      )
  103.                                     ) ;_ end of cond
  104.                               ) ;_ end of lambda
  105.                             ) ;_ end of function
  106.                           *adn-settings*
  107.                           ) ;_ end of mapcar
  108.                   ) ;_ end of vl-remove-if
  109.                ) ;_ end of setq
  110.        (alert
  111.          (strcat "При сохранении файла обнаружены следующие превышения"
  112.                  "\nс момента последнего сохранения"
  113.                  (apply (function strcat)
  114.                         (mapcar (function
  115.                                   (lambda (x / o)
  116.                                     (strcat "\n"
  117.                                             (if (= (type
  118.                                                      (setq o (vl-catch-all-apply
  119.                                                                (function (lambda () (vla-item (vla-get-dictionaries *adn-doc*) (cdr (assoc "name" x)))))
  120.                                                                ) ;_ end of vl-catch-all-apply
  121.                                                            ) ;_ end of setq
  122.                                                      ) ;_ end of type
  123.                                                    'vla-object
  124.                                                    ) ;_ end of =
  125.                                               "Словарь"
  126.                                               "Свойство"
  127.                                               ) ;_ end of if
  128.                                             " \""
  129.                                            (cdr (assoc "name" x))
  130.                                            "\" : "
  131.                                             (itoa (cdr (assoc "count" x)))
  132.                                             ) ;_ end of strcat
  133.                                     ) ;_ end of lambda
  134.                                   ) ;_ end of function
  135.                                 datas
  136.                                 ) ;_ end of mapcar
  137.                         ) ;_ end of apply
  138.                  "\n\n"
  139.                  "Выполните очистку файла!"
  140.                  ) ;_ end of strcat
  141.          ) ;_ end of alert
  142.        ) ;_ end of if
  143.      ;; Если сравнивать надо не с последним сохранением, а с начальным состоянием,
  144.      ;; следующую строку надо будет удалить
  145.      (adn-save-settings)
  146.      )
  147.     ) ;_ end of cond
  148.   ) ;_ end of defun

Обрати внимание на комментарии.
Реактор срабатывает только на начало сохранения, очистка не выполняется.
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Алексей, спасибо. :) Сегодня попробую.
Вроде работает :)
Очень сильно извиняюсь, можно одну небольшую поправку?  ::)
Сравнивать превышение надо не с последним сохранением и не с начальным состоянием, а просто с критическим значением. Иначе теряется смысл проверки, если человек открыл уже замусоренный файл, то реактор не оповестит при сохранении, что файл замусорен... :-[
« Последнее редактирование: 06-05-2016, 10:09:01 от Подшиваленко Дмитрий »

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
В принципе не сложно. Просто есть несколько вопросов (ну это как обычно):
1. Если был вставлен "загаженный" файл (ссылкой или блоком) - что делаем?
2. Критическое количество "на старте" и "с момента последнего сохранения" / "с момента начала" - одинаковое или будет разное? Т.е., например, при старте количество масштабов допускается до 20, а при сохранении изменение на 10 уже не гуд.
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
В принципе не сложно. Просто есть несколько вопросов (ну это как обычно):
1. Если был вставлен "загаженный" файл (ссылкой или блоком) - что делаем?
2. Критическое количество "на старте" и "с момента последнего сохранения" / "с момента начала" - одинаковое или будет разное? Т.е., например, при старте количество масштабов допускается до 20, а при сохранении изменение на 10 уже не гуд.
1. Ничего не делаем. Если ссылкой вставляется "загаженный" файл, то весь мусор перекочёвывает в новый файл, в котором это всё будет ловиться на этапе сохранения.
2. Критическое количество будет одно на всё время работы с файлом. То есть при сохранении достаточно просто сравнивать текущее количество с критическим и выдавать сообщение.
Немного по коду... Когда я увидел твой код из полутора сотен строк, я немного прибалдел. Я думал что конструкция будет гораздо проще, что-то в духе (если такая конструкция, конечно, возможна):
Код - Auto/Visual Lisp [Выбрать]
  1. (load "check-dict2.lsp")
  2. (реактор на сохранение)
  3.  (if (> (check-dict2 nil "ACAD_SCALELIST") 100) (alert "масштабы"))
  4.  (if (> (check-dict2 nil "ACAD_DGNLINESTYLECOMP") 10000) (alert "DGN"))
  5. )
где check-dict2 - функция отсюда: http://adn-cis.org/forum/index.php?topic=709.msg20101#msg20101
Ну и дописать отдельно функцию определения количества RegApp, поскольку, как я понял, их количество хранится не в словаре, а в символьной таблице.
Правда в этих символьных таблица хранится ещё много чего интересного, поэтому возникает соблазн написать универсальную функцию наподобие check-dict2, в которую передавать имя таблицы, а она будет возвращать количество элементов :)
И ещё хотелка. В твоей статье про реакторы есть фраза "В реакторах не срабатывает обычный command или vl-cmdf. Если "с ножом к горлу" надо использовать командную строку (бывает такое), то следует использовать механизм vla-sendcommand для текущего документа"
Так вот, практически "с ножом к горлу" для масштабов аннотаций нужно выполнить  (if (> (check-dict2 nil "ACAD_SCALELIST") 100) (command "_-scalelistedit" "_d" "*" "_e")), ибо подключение ссылкой чертежа с большим количеством масштабов происходит очень долго. Недавно в сети был обнаружен файл, содержащий 40 тысяч!! масштабов аннотаций. На неслабом компе (Core i7 3.60GHz) он подключался как ссылка 15 минут! После очистки он подключился за 2 секунды.