Странное поведение аннотативного блока при копировании его из другого файла.

Автор Тема: Странное поведение аннотативного блока при копировании его из другого файла.  (Прочитано 3717 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Добрый день. Копируем и вставляем аннотативный блок в Layout файла1 из  файла2- блок в базе появляется, но не отображается в редакторе. Появляется при повторном открытии файла. Аннотативность убираем из файла2, все ок. Как заставить отображаться вставленный аннотативный блок в файле1 без переключений? (вариант с переключением в модель и обратно не работает).
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6.  
  7. namespace pavpp
  8. {
  9.     public class pavpp
  10.     {
  11.         [CommandMethod("PAVPP")]
  12.         public void Run()
  13.         {
  14.             Document doc = Application.DocumentManager.MdiActiveDocument;
  15.             Database db = doc.Database;
  16.             Editor ed = doc.Editor;
  17.             ObjectIdCollection ids = new ObjectIdCollection();
  18.             using (Transaction tr = db.TransactionManager.StartTransaction())
  19.             {
  20.                 //создаем временную базу
  21.                 Database newDB = new Database(false, false);
  22.                 string pth = @"D:\.....\1.dwg";
  23.                 newDB.ReadDwgFile(pth, System.IO.FileShare.Read, false, string.Empty);
  24.                 BlockTable bt = tr.GetObject(newDB.BlockTableId, OpenMode.ForRead) as BlockTable;
  25.  
  26.                 //копируем определение динамического блока в активный файл
  27.                 ids.Add(bt["Names"]);
  28.                 IdMapping iMap = new IdMapping();
  29.                 db.WblockCloneObjects(ids, db.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false);
  30.  
  31.                 //вставляем блок в активный файл
  32.                 ObjectId psid = db.CurrentSpaceId;
  33.                 BlockTableRecord ms = tr.GetObject(psid, OpenMode.ForWrite) as BlockTableRecord;
  34.                 BlockTable bt0 = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
  35.                 BlockReference br = new BlockReference(Point3d.Origin, bt0["Names"]);
  36.                 // blRefTest.SetDatabaseDefaults();
  37.                 ms.AppendEntity(br);
  38.                 tr.AddNewlyCreatedDBObject(br, true);
  39.                 //ed.Regen();
  40.                 //ed.UpdateScreen();
  41.                 //br.RecordGraphicsModified(true);
  42.  
  43.                 //переключаем свойство динблока
  44.                 Number(br);
  45.  
  46.                 //включаем внешние ссылки блока
  47.                 db.ResolveXrefs(true, false);
  48.                 tr.Commit();
  49.             }
  50.         }
  51.  
  52.         private void Number(BlockReference bref)
  53.         {
  54.             foreach (DynamicBlockReferenceProperty num in bref.DynamicBlockReferencePropertyCollection)
  55.             {
  56.                 if (num.PropertyName == "Test")
  57.                 {
  58.                     num.Value = "222";
  59.                     return;
  60.                 }
  61.             }
  62.         }
  63.     }
  64. }
  65.  

Отмечено как Решение pavka_97 07-02-2019, 13:19:23

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Здесь всё что тебе нужно: https://adndevblog.typepad.com/autocad/2012/07/inserting-annotative-blocks.html
Нехватает вот этого:
Код - C# [Выбрать]
  1. btr.Annotative = AnnotativeStates.True; // Это BlockTableRecord вставляемого блока
  2. ObjectContextManager ocm = db.ObjectContextManager;
  3. ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
  4. ObjectContexts.AddContext(br, occ.CurrentContext);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 806
  • Карма: 166
    • Мои плагины к Автокаду
Причем, если вставлять в PaperSpace, то occ.CurrentContext не годится - не будет отображаться все равно. Надо будет добавлять контекст occ.GetContext("1:1")

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Да вроде и без occ.GetContext("1:1") работает. Что эта за ситуация, что требуется occ.GetContext("1:1")? Когда в разных файлах разная аннотативность? У меня в разных комбинациях пока все ок. Доеду до работы, проверю еще на рабочих файлах.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 806
  • Карма: 166
    • Мои плагины к Автокаду
У меня тоже работало, а потом столкнулся с тем, что на бумагу так нельзя вставлять. Случай редкий т.к. аннотативность на бумаге абсолютно бессмыслена. И Автокад должен бы ее игнорировать. Думаю проблема связана с тем, что на бумаге всегда масштаб 1:1, а текущий масштаб - он только для модели и он там может быть другим. Возможно я просто раньше не проверял случай, когда в модели задан масштаб аннотаций не равный 1:1. А может это просто глюк у меня в 2019 вылез, occ.CurrentContext выдает черти что. Но все решилось проверкой, куда вставляется блок, в какое пространство. Беда только в том, что пользователь теоретически может поменять имя масштабу - назначить не "1:1", а как угодно. Так что по честному надо еще и перебирать все масштабы и искать, какой из них на самом деле 1:1.

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

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

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Александр Ривилис, теперь да :).
avc, даже при переименовании 1:1 и при назначении произвольного имени масштабу 1:1, у меня код работает как надо (AutocadEn16x64,Windows7).

Спасибо всем за ответы.

Off-Topic: показать
Прошу прощения за дурацкие вопросы. Возьму за правило вопросы задавать не вечером от усталости, а утром. Может и спрашивать не придется :)

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Нашел одно неудобство.
btr.Annotative = AnnotativeStates.True; // Это BlockTableRecord вставляемого блока
ObjectContextManager ocm = db.ObjectContextManager;
ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
ObjectContexts.AddContext(br, occ.CurrentContext)
С этим куском не хочет работать в accoreconsole (консоль запускается по сценарию scr через bat). Это относится к недостаткам консоли или я опять что -то делаю не так?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
С этим куском не хочет работать в accoreconsole (консоль запускается по сценарию scr через bat). Это относится к недостаткам консоли или я опять что -то делаю не так?
Что значит не хочет работать? Какие-то сообщения об ошибках?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Да, вылетает из консоли.Появляется диалоговое окно windows закрыть/отладить. Без аннотативности код работает. Я подумал может кусок кода как то с ActiveX связан, что в консоли вроде не работает?

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

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