Интересное поведение Table после вставки

Автор Тема: Интересное поведение Table после вставки  (Прочитано 5042 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Есть стиль таблицы, там есть TableTemplate. Из него получаю объект таблицы с помощью template.CreateTable, после чего заполняю, передаю в EntityJig, там получаю точку вставки, и в транзакции вставляю в текущую BTR.

Далее обнаруживается интересное поведение вставленной таблицы. Я записал всё на видео, ниже пояснения:
1. Править содержимое не представляется возможным (на приложенном видео видно, что при первом выделении ячейка, да и таблица выделяются не как обычно). Лучше посмотреть, чем расписывать.
2. Привязаться можно только к "точке вставки" вставки блока таблицы. Привязка к примитивам таблицы не работает.
3. ArxDbg показывает, что у таблицы BlockName - kNull!!
Двигаем таблицу, и вуаля, всё работает как надо!

Ссылка на видео

Ниже привожу код, мало ли, чего сделал не так.
Код - C# [Выбрать]
  1. private Table CreateTableFromTemplate(string styleName)
  2. {
  3.     if (string.IsNullOrWhiteSpace(styleName))
  4.         throw new ArgumentNullException("StyleName");
  5.            
  6.     Table t = null;
  7.            
  8.     using (Transaction tr = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
  9.     {
  10.         DBDictionary tsdict = (DBDictionary)tr.GetObject(HostApplicationServices.WorkingDatabase.TableStyleDictionaryId, OpenMode.ForRead);
  11.  
  12.         if (!tsdict.Contains(styleName))
  13.             throw new WrongDataException("В файле отсутствует требуемый стиль таблиц: " + styleName);
  14.                
  15.         TableStyle ts = (TableStyle)tr.GetObject(tsdict.GetAt(styleName), OpenMode.ForRead);
  16.         if (ts.Template == ObjectId.Null)
  17.             throw new WrongDataException("В табличном стиле " + styleName + " отсутствует шаблон");
  18.                
  19.         TableTemplate template = (TableTemplate)tr.GetObject(ts.Template, OpenMode.ForRead);
  20.         t = template.CreateTable(TableCopyOptions.None);
  21.         for (int i = 0; i < t.Rows.Count-1; i++)
  22.         {
  23.             if (t.Rows[i].Style == "_DATA")
  24.                 t.DeleteRows(i--,1);
  25.         }
  26.         t.GenerateLayout();
  27.                
  28.         tr.Commit();
  29.     }
  30.  
  31.     return t;
  32. }
Потом я её заполняю, а потом вставляю Jig'ом
Код - C# [Выбрать]
  1. public class TableJigger : EntityJig
  2. {
  3.     private double tolerance = 0.0001;
  4.        
  5.     private Point3d insertPoint;
  6.        
  7.     public TableJigger(Entity entity)
  8.         : base(entity)
  9.     { }
  10.        
  11.     protected override bool Update()
  12.     {
  13.         (this.Entity as Table).Position = this.insertPoint;
  14.         (this.Entity as Table).GenerateLayout();
  15.         return true;
  16.     }
  17.        
  18.     protected override SamplerStatus Sampler(JigPrompts prompts)
  19.     {
  20.         JigPromptPointOptions ppo = new JigPromptPointOptions("Укажите точку вставки таблицы");
  21.         ppo.UserInputControls = UserInputControls.GovernedByUCSDetect;
  22.         PromptPointResult res = prompts.AcquirePoint(ppo);
  23.         if (res.Status == PromptStatus.Cancel)
  24.             return SamplerStatus.Cancel;
  25.            
  26.         if (res.Value.IsEqualTo(insertPoint, new Tolerance(tolerance, tolerance)))
  27.             return SamplerStatus.NoChange;
  28.            
  29.         insertPoint = res.Value;
  30.         return SamplerStatus.OK;
  31.     }
  32.        
  33.     public static PromptResult Jig(Table table)
  34.     {
  35.         PromptResult result = null;
  36.            
  37.         Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  38.         Database db = HostApplicationServices.WorkingDatabase;
  39.         using (Transaction tr = db.TransactionManager.StartTransaction())
  40.         {
  41.             TableJigger jigger = new TableJigger(table);
  42.             result = ed.Drag(jigger);
  43.                
  44.             if (result.Status == PromptStatus.OK)
  45.             {
  46.                 BlockTableRecord currSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  47.                 currSpace.AppendEntity(table);
  48.                 tr.AddNewlyCreatedDBObject(table, true);
  49.                 db.TransactionManager.QueueForGraphicsFlush();
  50.             }
  51.                
  52.             tr.Commit();
  53.         }
  54.            
  55.         return result;
  56.     }
  57. }

И да! Содержимое таблицы при таком Jig'е почему-то не отображается. Что я тут делаю неправильно?
« Последнее редактирование: 29-08-2014, 10:58:19 от bargool »
Алексей

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
По совету Дмитрия Загорулькина добавил table.RecomputeTableBlock(true) после добавления в текущее пространство и транзакцию. Таблица после вставки начала вести себя нормально.
Но почему не отображается содержимое?
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но почему не отображается содержимое?
Попробуй после 
Код - C# [Выбрать]
  1. t = template.CreateTable(TableCopyOptions.None);
вставить
Код - C# [Выбрать]
  1. t.SetDatabaseDefaults();
Хотя совсем не уверен, что это поможет, так как таблица это сложный примитив, который зависит во многом от базы, в которую вставлен. А в момент JIG от еще никуда не вставлен. Не исключено, что понадобится заменить EntityJig на DrawJig.

« Последнее редактирование: 01-10-2020, 14:13:26 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Попробуй после 
Код - C# [Выбрать]
  1. t = template.CreateTable(TableCopyOptions.None);
вставить
Код - C# [Выбрать]
  1. t.SetDatabaseDefaults();
Не работает
Как замену на DrawJig попробую - отпишусь, спасибо
Алексей