Редактирование объекта по событию

Автор Тема: Редактирование объекта по событию  (Прочитано 6474 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
По мотивам одной из тем на dwg.ru поигрался с реакторами на модификацию объекта, и не совсем понял как редактировать объект по событию.
Ниже, слегка переделанный код из справки и собственно вопрос, как запихать в ячейку таблицы, значение ширины столбца?
При попытке открыть объект для редактирования, код не срабатывает. Пока интерес чисто спортивный, но разобраться хочется.

Я понимаю, что можно сделать в таблице поле с ссылкой на длину некой линии и по событию менять эту линию, но хотелось бы без посредников, напрямую.
Код - C# [Выбрать]
  1.         Db.Table _tbl = null;
  2.         public  void acTablMod(object senderObj, EventArgs evtArgs)
  3.         {
  4.             App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
  5.             Db.Database acCurDb = acDoc.Database;
  6.             Ed.Editor acEd = acDoc.Editor;
  7.             Double www = _tbl.Columns[0].Width;
  8.             acEd.WriteMessage(_tbl.Columns[0].Width.ToString());
  9.  
  10.             // А вот тут код падает и при попытке UpgradeOpen(), дальнейший код не выполняется
  11.             if (_tbl.IsWriteEnabled == false)
  12.             {
  13.                 _tbl.UpgradeOpen();
  14.             }
  15.             _tbl.Cells[2, 0].TextString = "1111";
  16.             _tbl.DowngradeOpen();
  17.         }
  18.  
  19.  
  20.         [Rtm.CommandMethod("AddTableEvent")]
  21.          public void AddTableEvent()
  22.         {
  23.             App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
  24.             Db.Database acCurDb = acDoc.Database;
  25.             using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
  26.             {
  27.                 Db.BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, Db.OpenMode.ForRead) as Db.BlockTable;
  28.                 Db.BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace],
  29.                                                                                 Db.OpenMode.ForWrite) as Db.BlockTableRecord;
  30.  
  31.                 Gem.Point3d acPoint = new Gem.Point3d(0.0, 0.0, 0.0);
  32.                 _tbl = new Db.Table();
  33.                 Db.ObjectId tbID = CreateAndSetTableStyle(ref acPoint, "test tabl");
  34.                 _tbl = (Db.Table)acTrans.GetObject(tbID, Db.OpenMode.ForWrite);
  35.                 _tbl.InsertRows(2, 800, 1);
  36.                 _tbl.Cells[2, 0].TextString = "gttth";
  37.                 _tbl.Modified += new EventHandler(acTablMod);
  38.                 acTrans.Commit();
  39.             }
  40.         }
  41.        
  42.         [Rtm.CommandMethod("RemoveTableEvent")]
  43.          public void RemoveTableEvent()
  44.         {
  45.             if (_tbl != null)
  46.             {
  47.                 App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
  48.                 Db.Database acCurDb = acDoc.Database;
  49.                 using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
  50.                 {
  51.                     _tbl = acTrans.GetObject(_tbl.ObjectId, Db.OpenMode.ForRead) as Db.Table;
  52.                     if (_tbl.IsWriteEnabled == false)
  53.                         _tbl.UpgradeOpen();
  54.  
  55.                     _tbl.Modified -= new EventHandler(acTablMod);
  56.                     _tbl = null;
  57.                     acTrans.Commit();
  58.                 }
  59.             }
  60.         }
  61.  
  62.  
  63.         private  Db.ObjectId CreateAndSetTableStyle(ref Gem.Point3d acPnt, string name)
  64.         {
  65.             string sTableStyleName = "Vedomosti";
  66.             App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
  67.             Db.Database acCurDb = acDoc.Database;
  68.             Ed.Editor acEd = acDoc.Editor;
  69.  
  70.             Db.ObjectId TableStyleId;
  71.             Db.ObjectId tbID = new Db.ObjectId();
  72.  
  73.             using (Db.Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  74.             {
  75.                 Db.TableStyle ts;
  76.                 Db.DBDictionary TableDict = (Db.DBDictionary)acTrans.GetObject(acCurDb.TableStyleDictionaryId, Db.OpenMode.ForRead);
  77.                 if (TableDict.Contains(sTableStyleName))
  78.                 {
  79.                     TableStyleId = TableDict.GetAt(sTableStyleName);
  80.                 }
  81.                 else
  82.                 {
  83.                     ts = new Db.TableStyle();
  84.                     ts.SetTextHeight(350, (int)Db.RowType.HeaderRow);
  85.                     ts.SetTextHeight(350, (int)Db.RowType.DataRow);
  86.                     ts.SetTextHeight(500, (int)Db.RowType.TitleRow);
  87.                     ts.SetAlignment(Db.CellAlignment.MiddleCenter, (int)Db.RowType.HeaderRow);
  88.                     ts.SetAlignment(Db.CellAlignment.MiddleCenter, (int)Db.RowType.TitleRow);
  89.                     ts.SetAlignment(Db.CellAlignment.MiddleCenter, (int)Db.RowType.DataRow);
  90.                     ts.IsHeaderSuppressed = false;
  91.                     ts.IsTitleSuppressed = false;
  92.                     TableStyleId = ts.PostTableStyleToDatabase(acCurDb, sTableStyleName);
  93.                     acTrans.AddNewlyCreatedDBObject(ts, true);
  94.                 }
  95.                 ts = (Db.TableStyle)acTrans.GetObject(TableStyleId, Db.OpenMode.ForWrite);
  96.                 Db.Table tb = new Db.Table();
  97.                 if (TableStyleId == Db.ObjectId.Null)
  98.                 {
  99.                     tb.TableStyle = acCurDb.Tablestyle;
  100.                 }
  101.                 else
  102.                 {
  103.                     tb.TableStyle = TableStyleId;
  104.                 }
  105.                 tb.Rows[0].Height = 800;
  106.                 tb.InsertRows(1, 1600, 1);
  107.                 tb.InsertColumns(0, 1500, 1);
  108.                 tb.InsertColumns(1, 7000, 1);
  109.                 tb.Columns[2].Width = 1500;
  110.                 tb.Cells[0, 0].TextHeight = 500;
  111.                 tb.Cells[0, 0].TextString = name;
  112.                 tb.Cells[0, 0].Alignment = Db.CellAlignment.MiddleCenter;
  113.                 string[] str = new string[8];
  114.                 str[0] = "Марка";
  115.                 str[1] = "Размер";
  116.                 str[2] = "Кол-во на этаж";
  117.                 for (int i = 0; i <= 2; i++)
  118.                 {
  119.                     tb.Cells[1, i].TextString = str[i];
  120.                 }
  121.                 tb.Position = acPnt;
  122.                 tb.GenerateLayout();
  123.                 Db.BlockTable acBlkTbl;
  124.                 Db.BlockTableRecord acBlkTblRec;
  125.                 try
  126.                 {
  127.                     acBlkTbl = (Db.BlockTable)acTrans.GetObject(acCurDb.BlockTableId, Db.OpenMode.ForRead);
  128.                     acBlkTblRec = (Db.BlockTableRecord)acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace], Db.OpenMode.ForWrite);
  129.                     acBlkTblRec.AppendEntity(tb);
  130.                     tbID = tb.ObjectId;
  131.                     acTrans.AddNewlyCreatedDBObject(tb, true);
  132.                     acTrans.Commit();
  133.                 }
  134.                 catch (Exception ex)
  135.                 {
  136.                     acDoc.Editor.WriteMessage("\nНе удалось добавить стиль таблицы в базу чертежа.");
  137.                     acEd.WriteMessage("\n" + ex.Message);
  138.                 }
  139.             }
  140.             return tbID;
  141.         }
  142.  
  143.  

Отмечено как Решение Владимир Шу 01-03-2016, 15:26:18

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Редактирование объекта по событию
« Ответ #1 : 01-03-2016, 09:40:33 »
По мотивам одной из тем на dwg.ru поигрался с реакторами на модификацию объекта, и не совсем понял как редактировать объект по событию.
1) В событии модификации объекта его нельзя редактировать.
2) Оптимальный вариант - в событии модификации запомнить ObjectId модифицируемого объекта, а реальное его изменение проводить в каком-либо другом событии (например, Document.CommandEnded или Application.Idle или Editor.EnteringQuiescentState).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Редактирование объекта по событию
« Ответ #2 : 01-03-2016, 09:46:07 »
Я уж не помню что я шаманил с реакторами таблиц, но точно помню, что по крайней мере из под лиспа, там какая-то чехорда. Решение было типа пропустить первое (второе?) срабатывание реактора и уже после этого можно записывать - но все это было автокаде в 8-10, сейчас поведение могло изменится.
з.ы. Я вообще автокадные таблицы "недолюбливаю". Весь свой вывод "табличных" данных я перевел напрямую (без участия акада) в PDF, которые потом сращиваю с pdf'ами полученными уже  из акада (чертежи) - так быстрей и надежней.

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Редактирование объекта по событию
« Ответ #3 : 01-03-2016, 10:05:43 »
Я вообще автокадные таблицы "недолюбливаю"
Да я их и сам не очень люблю и предпочитаю сразу в xlsx транслировать, но поиграться то интересно.

2 Александр Ривилис, спасибо, попробую.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Редактирование объекта по событию
« Ответ #4 : 01-03-2016, 11:31:25 »
предпочитаю сразу в xlsx транслировать
Про вывод я имел в виду только печатный вид. Сами-же данные естественно сохраняются отдельно в БД.

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Редактирование объекта по событию
« Ответ #5 : 01-03-2016, 15:26:13 »
Editor.EnteringQuiescentState
Попробовал. работает.
Решение было типа пропустить первое (второе?) срабатывание реактора и уже после этого можно записывать - но все это было автокаде в 8-10, сейчас поведение могло изменится.
на 2014 акаде не поменялось.
ЗЫ.
Решение отметил.