Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: avc от 02-10-2020, 14:28:36

Название: Модификация примитивов во внешней ссылке
Отправлено: avc от 02-10-2020, 14:28:36
Пытаюсь взорвать блок, полученный изнутри внешней ссылки. Примитивы удалось сохранять в базе данных внешней ссылки (не без извращений). Вроде все получается. Автокад не ругается и выглядит все измененным. НО! Если открыть ссылку - там нет никаких изменений. Сам подключенный dwg-файл не меняется. После переоткрытия основного чертежа все изменения теряются. 
Есть какой-то метод сохранения изменений во внешних ссылках?
Можно конечно загрузить базу данных внешнего чертежа и там модифицировать. Не пробовал так делать, но ожидаю проблем с блокировкой файла (ведь по сути один файл будет открыт дважды) и понадобится внешнюю ссылку как-то обновлять... Ищу пути по проще.
Название: Re: Модификация примитивов во внешней ссылке
Отправлено: Александр Ривилис от 02-10-2020, 15:50:49
Не пробовал воспользоваться LongTransactionManager?
Название: Re: Модификация примитивов во внешней ссылке
Отправлено: Александр Ривилис от 02-10-2020, 15:59:07
Примитивы удалось сохранять в базе данных внешней ссылки (не без извращений). Вроде все получается. Автокад не ругается и выглядит все измененным. НО! Если открыть ссылку - там нет никаких изменений.
А базу эту ты сохранял?
Название: Re: Модификация примитивов во внешней ссылке
Отправлено: avc от 02-10-2020, 16:08:38
А базу эту ты сохранял?
В смысле просто вызвать Database.Save() ? А так можно? Сейчас попробую...
Что за заверь LongTransactionManager не знаю. Посмотрю...
Название: Re: Модификация примитивов во внешней ссылке
Отправлено: Александр Ривилис от 02-10-2020, 16:09:16
Еще вариант: https://adn-cis.org/redaktirovanie-po-mestu-fajlov-vneshnix-ssyilok.html
Название: Re: Модификация примитивов во внешней ссылке
Отправлено: avc от 02-10-2020, 16:23:50
Сохранить базу не получилось - выдает eFileInternalErr. Как я и предполагал...
Буду пробовать XrefFileLock
Название: Re: Модификация примитивов во внешней ссылке
Отправлено: avc от 02-10-2020, 17:48:14
Да. С этими шаманствами работает. Но не сразу сохраняет, а при сохранении основного файла меняется и файл внешней ссылки. Так даже лучше.
Код - 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.  
Название: Re: Модификация примитивов во внешней ссылке
Отправлено: Александр Ривилис от 02-10-2020, 19:42:39
у btr база данных - основной чертеж. что-то я не придумал как получить из btr базу данных внешней ссылки. приходится извлекать объект из нее
BlockTableRecord.GetXrefDatabase