ReadDwgFile - Cмещение атрибутов

Автор Тема: ReadDwgFile - Cмещение атрибутов  (Прочитано 7935 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Привет.
Проблеме смещения атрибутов лет сто уже  :(
Код - C# [Выбрать]
  1.         [CommandMethod("TestAtr", CommandFlags.Modal)]
  2.         public static void TestAtr()
  3.         {
  4.             const string file = @"c:\temp\testAtr.dwg";
  5.             using (var db = new Database(false, true))
  6.             {
  7.                 db.ReadDwgFile(file, FileShare.Read, false, "");
  8.                 db.CloseInput(true);
  9.                 using (var t = db.TransactionManager.StartTransaction())
  10.                 {
  11.                     SetAtrValue(db, "TESTTAG", "TestValue");
  12.                     t.Commit();
  13.                 }
  14.                 db.SaveAs(file, DwgVersion.Current);
  15.             }
  16.         }
  17.  
  18.         private static void SetAtrValue(Database db, string tag, string value)
  19.         {
  20.             var ms = (BlockTableRecord) SymbolUtilityServices.GetBlockModelSpaceId(db).GetObject(OpenMode.ForRead);
  21.             foreach (var id in ms)
  22.             {
  23.                 var blRef = id.GetObject(OpenMode.ForRead, false, true) as BlockReference;
  24.                 if (blRef == null) continue;
  25.                 foreach (ObjectId atrId in blRef.AttributeCollection)
  26.                 {
  27.                     var atrRef = (AttributeReference) atrId.GetObject(OpenMode.ForRead, false, true);
  28.                     if (string.Equals(atrRef.Tag, tag, StringComparison.OrdinalIgnoreCase))
  29.                     {
  30.                         atrRef.UpgradeOpen();
  31.                         atrRef.TextString = value;
  32.                         atrRef.AdjustAlignment(db);
  33.                     }
  34.                 }
  35.             }
  36.         }
До и после - выравнивание атрибута стоит по центру:

Файл с блоком прилагается.

Отмечено как Решение Вильдар 21-04-2018, 15:55:19

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: ReadDwgFile - Cмещение атрибутов
« Ответ #1 : 21-04-2018, 14:55:14 »
Нашел решение. Нужно менять рабочую базу:
Код - C# [Выбрать]
  1.         HostApplicationServices.WorkingDatabase = db;
И потом не забыть вернуть ее значение.
Код - C# [Выбрать]
  1.         [CommandMethod(nameof(TestAtr), CommandFlags.Modal)]
  2.         public static void TestAtr()
  3.         {
  4.             const string file = @"c:\temp\testAtr.dwg";
  5.             using (var db = new Database(false, true)) // При этом слетает выравнивание атрибутов!!!
  6.             {
  7.                 db.ReadDwgFile(file, FileShare.Read, false, "");
  8.                 db.CloseInput(true);
  9.                 using (var t = db.TransactionManager.StartTransaction())
  10.                 {
  11.                     var wdb = HostApplicationServices.WorkingDatabase;
  12.                     HostApplicationServices.WorkingDatabase = db;
  13.                     SetAtrValue(db, "TESTTAG", "TestValue");
  14.                     t.Commit();
  15.                     HostApplicationServices.WorkingDatabase = wdb;
  16.                 }
  17.                 db.SaveAs(file, DwgVersion.Current);
  18.             }
  19.         }

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: ReadDwgFile - Cмещение атрибутов
« Ответ #2 : 21-04-2018, 14:59:59 »
Для временного переключения рабочей базы удобно использовать disposable класс:
https://sites.google.com/site/bushmansnetlaboratory/moi-zametki/attsynch
Код - C# [Выбрать]
  1.     public sealed class WorkingDatabaseSwitcher : IDisposable
  2.     {
  3.         private readonly Database oldDb;
  4.        
  5.         public WorkingDatabaseSwitcher(Database db)
  6.         {
  7.             oldDb = HostApplicationServices.WorkingDatabase;
  8.             HostApplicationServices.WorkingDatabase = db;
  9.         }
  10.  
  11.         public void Dispose()
  12.         {
  13.             HostApplicationServices.WorkingDatabase = oldDb;
  14.         }
  15.     }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ReadDwgFile - Cмещение атрибутов
« Ответ #3 : 24-04-2018, 10:52:18 »
Проблеме смещения атрибутов лет сто уже  :(
Так сто лет назад её и решили.  ;) Извини, но я был на выходных на даче почти без доступа к интернету, так что не мог ответить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение