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

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
У тебя еще более интересная ошибка допущена: вместо vlr-remove поставлено vl-remove
Так это же твой кусок кода отсюда: http://adn-cis.org/forum/index.php?topic=709.msg20253#msg20253 :) Я его брал за основу :) Поправить как у тебя в последнем коде?
Смотри, вариант 1: в файле до фига ссылок (пускай 20 шт., включая вложенные). Общий список аннотативных масштабов превышает все разумные пределы - а что делать? И тут при сохранении вываливается Fatal Error...
А как на такую ситуацию влияет _qsave в реакторе?
На всякий случай пишутся логи по очистке. Нашёлся файл, содержащий почти 60 тысяч (59489) масштабов аннотаций.
Или, вариант 2 - человек вызывает SAVEAS, планируя сохранить старый вариант. А тут ему: "Нна! Думал, что не сохранишь? А вот фига!". И как к коду будут относиться?
Ну будет старый вариант, только без огромного количества масштабов :) Нечего их плодить. И опять же как _qsave в реакторе повлияет на эту ситуацию, если в реакторе уже почистились масштабы?
Хотя в принципе _qsave можно и убрать из реактора во избежание других косяков, но тогда не будет уверенности, что сохранён очищенный файл.
Кстати, очистка масштабов сделана и при загрузке. И очень показательно, что один и тот же файл очистился сначала при загрузке, а потом реактором при сохранении, то есть во время работы он успел замусориться.
По поводу "табличных записей" - см. vla-get-textstyles, vla-get-dimstyles, потом понадобится смотреть словарь ACAD_TABLESTYLE, ACAD_MLINESTYLE и т.п.
Ну сделай отдельную функцию только подсчёта RegApp, если не сложно :)
P.S. Заремил _qsave в реакторе с комментарием "Алексей Кулик не одобрил" :)

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

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Я очепятался, а ты не проверил )))
сделай отдельную функцию только подсчёта RegApp, если не сложно
Только их или потом опять будем добавлять функционал? Если только их - то в нужное место вставляй (setq datas (vla-get-count (vla-get-registeredapplications (vla-get-activedocument (vlax-get-acad-object))))) и обрабатывай полученный результат.
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Я очепятался, а ты не проверил )))
Чтобы проверить надо знать лисп :) Сейчас глянул разницу :)
Только их или потом опять будем добавлять функционал? Если только их - то в нужное место вставляй (setq datas (vla-get-count (vla-get-registeredapplications (vla-get-activedocument (vlax-get-acad-object))))) и обрабатывай полученный результат.
Да пока видимо только их, поскольку только они цепляются из ссылок и не чистятся стандартным диалогом purge.
Спасибо :)

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Алексей, добрый день.
Снова нужна твоя небольшая помощь.
Всё-таки я решил добавить реактор на присоединение ссылок для очистки от масштабов и приложений.
В принципе я написал его самостоятельно, он рабочий, но есть одна небольшая засада.
Иногда при вставке ссылки обнаруживаются циклические ссылки, и автокад выдаёт запрос в командной строке "Обнаружены циклические ссылки. Продолжить?".
Если нужно почистить масштабы командой (vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) (strcat "_-scalelistedit _d" "\r" "*" "\r" "_e" "\r")), то акад пытается ответить на запрос строками из этой команды. Вариант решения - добавить в функцию обработки реактора команду (vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) (strcat "_y" "\r")). Это работает, но при отсутствии запроса акад соответственно пишет: Неизвестная команда "Y". Не критично, но не очень красиво.
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2. (if adn-vlr-xref (progn (vlr-remove adn-vlr-xref) (setq adn-vlr-xref nil)))
  3. (if (not adn-vlr-xref) (setq adn-vlf-xref (vlr-xref-reactor nil '((:vlr-endAttach . adn-vlr-xref-end)))))
  4.  
  5. (defun adn-vlr-xref-end (_r data / )
  6.  (vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) (strcat "_y" "\r"))
  7.  (setq ra (vla-get-count (vla-get-registeredapplications (vla-get-activedocument (vlax-get-acad-object)))))
  8.  (if (> ra ra_crit) (vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) (strcat "_.-purge _r" "\r" "*" "\r" "_n" "\r")))
  9.  (setq sc (check-dict nil "ACAD_SCALELIST"))
  10.  (if (> sc sc_crit) (vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) (strcat "_-scalelistedit _d" "\r" "*" "\r" "_e" "\r")))
  11. )
Есть ли возможность отключить запрос на загрузку циклических ссылок (чтобы по-умолчанию было всегда "Да")? Лиспом, как я понимаю, отловить появление этого запроса не получится, ибо запрос появляется после окончания функции обработки реактора. Или я ошибаюсь?
В инете долго рылся, ничего адекватного не нашёл. В общем если будет время, ответь, пожалуйста  :)

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

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Как-то не сталкивался с ситуацией циклических ссылок... Встречался с ними, но только в Excel. Как они вообще возникают? Я пробовал когда-то подобное сотворить, но AutoCAD мне не дал возможности вставить циклическую ссылку. Можно пример (хотя бы на словах описать последовательность создания)?
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Открываешь файл Свет или Канализация и подключаешь к нему Сводный план сетей.dwg.
Файлы тестовые, с одной надписью. В коде можно убрать проверки и оставить одни команды очистки для теста.
Идея циклических ссылок в том, что файл №1 ссылается файл №2, а файл №2 ссылается файл №1, при этом тип ссылки должен быть "вставленная".
Самая простая последовательность действий:
В файл №1 (например Сводный план сетей) подключаешь файл №2 (например Вода), тип ссылки "вставленная". Потом в файл №2 (Вода) подключаешь файл №1 (Сводный план сетей), при этом тип ссылки уже не важен.

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

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
В файле "Вода" уже идет циклическая ссылка. То есть человек сознательно создал эту ситуацию.
В качестве идеи могу предложить следующее: в начале вставки ссылки открывать каждый файл через ObjectDBX, проверять внутри этого документа ссылки, снова открывать и составлять список ссылок. И анализировать его.
Код получится достаточно длинный и замороченный, вдобавок я не уверен в эффективности такого подхода. Попробовать что-либо сотворить смогу только в среду, не раньше :(
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Ну если очень сложно, то может и не надо? Переживёт народ неопознанную команду "Y" :)
Я думал может можно отключить сам запрос на циклические ссылки.

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
По первым прикидкам вроде работает
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
По первым прикидкам вроде работает
Спасибо. Потестирую недельки через 3, после отпуска :)

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

  • ADN Club
  • **
  • Сообщений: 64
  • Карма: 0
Доброго дня всем :)
Снова нужна ваша небольшая помощь :)
В общем с реактором на присоединение ссылок было почти всё хорошо, пока не обнаружились некоторые негативные моменты (в особенности сборка комплекта в zip происходит очень долго, ибо акад грузит ссылки и каждую чистит).
Появилась мысль сделать реактор на закрытие. Написал, потестил. Он работает, чистит и сохраняет чертёж после очистки, но есть один момент!
При нажатии на крестик (закрытие файла) до начала работы реактора на закрытие появляется диалог с запросом о сохранении изменений. Можно ли как-нибудь отловить ответ в этом диалоге и передать его реактору на закрытие, чтобы чистить и сохранять чертёж только при ответе "Да"?
Пока в реакторе сделано безусловное сохранение и чертёж сохраняется при любом ответе...
На всякий случай код реактора (в сильном сокращении):
Код - Auto/Visual Lisp [Выбрать]
  1. (if adn-vlr-close (progn (vlr-remove adn-vlr-close) (setq adn-vlr-close nil)))
  2. (if (not adn-vlr-close) (setq adn-vlr-close (VLR-Editor-Reactor nil '((:vlr-beginClose . vlr-close)))))
  3.  
  4. (defun vlr-close (_r data / )
  5.  (vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) (strcat "_.-purge _r" "\r" "*" "\r" "_n" "\r"))
  6.  (vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) (strcat "_qsave" "\r"))
  7. )

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно ли как-нибудь отловить ответ в этом диалоге и передать его реактору на закрытие, чтобы чистить и сохранять чертёж только при ответе "Да"?
В VisualLisp/AutoLisp??? Нет конечно. Тут нужны Windows hooks, на которые лисп не способен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Вообще-то я бы не стал в реакторах использовать команды...
Все, что сказано - личное мнение.

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

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