Модификация примитивов во внешней ссылке

Автор Тема: Модификация примитивов во внешней ссылке  (Прочитано 4461 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • *****
  • Сообщений: 812
  • Карма: 166
    • Мои плагины к Автокаду
Пытаюсь взорвать блок, полученный изнутри внешней ссылки. Примитивы удалось сохранять в базе данных внешней ссылки (не без извращений). Вроде все получается. Автокад не ругается и выглядит все измененным. НО! Если открыть ссылку - там нет никаких изменений. Сам подключенный dwg-файл не меняется. После переоткрытия основного чертежа все изменения теряются. 
Есть какой-то метод сохранения изменений во внешних ссылках?
Можно конечно загрузить базу данных внешнего чертежа и там модифицировать. Не пробовал так делать, но ожидаю проблем с блокировкой файла (ведь по сути один файл будет открыт дважды) и понадобится внешнюю ссылку как-то обновлять... Ищу пути по проще.

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не пробовал воспользоваться LongTransactionManager?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Примитивы удалось сохранять в базе данных внешней ссылки (не без извращений). Вроде все получается. Автокад не ругается и выглядит все измененным. НО! Если открыть ссылку - там нет никаких изменений.
А базу эту ты сохранял?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 812
  • Карма: 166
    • Мои плагины к Автокаду
А базу эту ты сохранял?
В смысле просто вызвать Database.Save() ? А так можно? Сейчас попробую...
Что за заверь LongTransactionManager не знаю. Посмотрю...

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 812
  • Карма: 166
    • Мои плагины к Автокаду
Сохранить базу не получилось - выдает eFileInternalErr. Как я и предполагал...
Буду пробовать XrefFileLock

Отмечено как Решение avc 02-10-2020, 18:36:09

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

  • ADN Club
  • *****
  • Сообщений: 812
  • Карма: 166
    • Мои плагины к Автокаду
Да. С этими шаманствами работает. Но не сразу сохраняет, а при сохранении основного файла меняется и файл внешней ссылки. Так даже лучше.
Код - C# [Выбрать]
  1. if (btr.IsFromExternalReference) // btr - BlockTableRecord
  2.       {
  3.         Database db = null; // у btr база данных - основной чертеж. что-то я не придумал как получить из btr базу данных внешней ссылки. приходится извлекать объект из нее
  4.         foreach (ObjectId subId in btr) // нужен только первый элемент чтоб получить его DB
  5.         {
  6.           db = subId.Database;
  7.           if (db != null) break;
  8.         }
  9.         using XrefFileLock Filelock = XrefFileLock.LockFile(btr.Id);
  10.         db.RestoreOriginalXrefSymbols();
  11.         using Transaction extTr = db.TransactionManager.StartTransaction();
  12.         foreach (ObjectId id in btr)
  13.           if (!id.IsNull && !id.IsErased && id.ObjectClass == dbBlockRef)
  14.             Do(id, extTr); // тут я удаляю и создаю новые объекты во внешней ссылке
  15.         extTr.Commit();
  16.         db.RestoreForwardingXrefSymbols();
  17.         return;
  18.       }
  19.  

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
у btr база данных - основной чертеж. что-то я не придумал как получить из btr базу данных внешней ссылки. приходится извлекать объект из нее
BlockTableRecord.GetXrefDatabase
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение